Nat*_*han 2 python printing floating-point precision printf
该值0.1
不能表示为 64 位浮点数。精确值大致等于0.10000000000000000555
https://www.exploringbinary.com/why-0-point-1-does-not-exist-in-floating-point/
您可以使用以下简单的代码突出显示此行为:
timestep = 0.1
iterations = 1_000_000
total = 0
for _ in range(iterations):
total += timestep
print(total - timestep * iterations) # output is not zero but 1.3328826753422618e-06
Run Code Online (Sandbox Code Playgroud)
我完全理解为什么0.1
不能表示为 float 64 的精确值,但我不明白的是为什么当我这样做时print(0.1)
,它输出0.1
而不是作为 float 64 的基础值。
当然,基础值在以 10 为基数的系统上有更多的数字,因此应该涉及一些舍入,但我正在寻找所有值的规范以及如何控制它。
我遇到了一些应用程序在数据库中存储数据的问题:
str(0.1)
)会显示0.1
0.10000000000000000555
,这会让最终用户感到困惑PS:我对其他价值观有其他问题
问候,
首先,你是对的,浮点数(单浮点数、双浮点数等)具有精确的值。
对于 64 位 IEEE-754 双精度,最接近 0.1 的可表示值将恰好是 0.1000000000000000055511151231257827021181583404541015625
,如您所见,相当长。但可表示的浮点值都具有有限数量的小数位数,因为基数 (2) 是 10 的某个幂的除数。
对于像 python 这样的 REPL 语言,必须具有以下属性:
一个后果就是
为了获得这些属性,有几种可能性:
Python 和许多其他语言都选择了第三种解决方案,因为0.10000000000000001
当用户输入0.1
. 人类用户通常选择较短的表示形式,而打印的表示形式供人类消费。越短越好。
不好的特性是,它可能会给人一种错误的印象,即这些浮点值存储的是精确的十进制值,例如 1/10。现在这里和许多地方都在传播这种知识。
归档时间: |
|
查看次数: |
196 次 |
最近记录: |