gpt4 book ai didi

python - 以可变精度打印 float

转载 作者:行者123 更新时间:2023-12-04 01:03:23 24 4
gpt4 key购买 nike

我想打印包含可变精度的 float 。

我有多个号码,例如:

0.634564644534135499
0.0005462007746487777
0.028820785252590582
0.0018751147995774936
0.0075146048125540816
0.00046670455

我想使用 print 获得与输出相同的数字。我知道可以使用 print("{:.19f}".format(0.0005462007746487777)) 固定小数位数,但我不想固定小数位数。由于不同的数字会有不同的小数位

代码

#!/usr/bin/env python3

number_1=0.634564644534135499
number_2=0.0005462007746487777
number_3=0.028820785252590582
number_4=0.0018751147995774936
number_5=0.0075146048125540816
number_6=0.00046670455

print("Number 1: ",number_1)
print("Number 2: ",number_2)
print("Number 3: ",number_3)
print("Number 4: ",number_4)
print("Number 5: ",number_5)
print("Number 6: ",number_6)

实际输出:

Number 1:  0.6345646445341355
Number 2: 0.0005462007746487777
Number 3: 0.028820785252590582
Number 4: 0.0018751147995774936
Number 5: 0.0075146048125540816
Number 6: 0.00046670455

要求的输出:

Number 1: 0.634564644534135499
Number 2: 0.0005462007746487777
Number 3: 0.028820785252590582
Number 4: 0.0018751147995774936
Number 5: 0.0075146048125540816
Number 6: 0.00046670455

我不明白的是,为什么 2 号(具有更高的精度)打印正确,但 1 号 却失去了精度?

最佳答案

从根本上说,float 对象无法满足您的要求,它们基本上是 C-double 的包装器,因此是 64 位 float 。

这里发生了几件事。在源代码中映射十进制文字输入存在一个根本问题:

0.634564644534135499

到实际的机器表示,不是十进制,而是二进制。

由于 64 位浮点格式的固有限制,多个十进制输入将映射到相同的底层表示:

>>> 0.634564644534135499 == 0.6345646445341355
True

实际上两者都不是,精确的小数实际上是:

>>> import decimal
>>> decimal.Decimal(0.6345646445341355)
Decimal('0.6345646445341355246227976749651134014129638671875')
>>> decimal.Decimal(0.634564644534135499)
Decimal('0.6345646445341355246227976749651134014129638671875')

当您天真地 print(some_float) 时,实际打印的是什么 将是一种表示,如果您输入,它保证映射回生成它的同一个 float 它作为浮点十进制文字。事实上,since Python 3.1 CPython 使用 David Gray 的算法来寻找保留值的最短表示。

因此,由于 float 的固有限制而遇到麻烦时通常会出现这种情况,请尝试使用 decimal.Decimal。请记住,输入应该是一个字符串。以下脚本:

import decimal
number_1 = decimal.Decimal('0.634564644534135499')
number_2 = decimal.Decimal('0.0005462007746487777')
number_3 = decimal.Decimal('0.028820785252590582')
number_4 = decimal.Decimal('0.0018751147995774936')
number_5 = decimal.Decimal('0.0075146048125540816')
number_6 = decimal.Decimal('0.00046670455')

print("Number 1: ",number_1)
print("Number 2: ",number_2)
print("Number 3: ",number_3)
print("Number 4: ",number_4)
print("Number 5: ",number_5)
print("Number 6: ",number_6)

打印:

Number 1:  0.634564644534135499
Number 2: 0.0005462007746487777
Number 3: 0.028820785252590582
Number 4: 0.0018751147995774936
Number 5: 0.0075146048125540816
Number 6: 0.00046670455

关于python - 以可变精度打印 float ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67365915/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com