点数学查询

好吧,所以我得到一些数字不能用二进制正确表示,就像1/3不能完全用十进制表示。

那么怎么会当我console.log(0.3)它返回0.3,但是当我console.log(0.1 + 0.2)它返回0.30000000000000004

如何简单地输出0.3而不是加法时出现错误(如果它是)?


假设我们近似于十进制的1/3和2/3。

1/3 = 0.333
2/3 = 0.667

我们加1/3 + 1/3:

1/3+1/3 = 0.333 + 0.333 = 0.666

我们没有得到2/3的近似值。 将1/3舍入到我们可以用十进制表示的东西不会产生一个等于我们2/3时的1/2的数字的数字。

同样的事情发生在二进制。 我们用0.1和0.2来表示我们可以用二进制表示的数字,但是如果我们近似为0.3,那么近似值的总和与我们得到的略有不同。 我们得到一些更高的值,结果显示为0.30000000000000004


内部表示0.10.2的不准确性足够小,以致Javascript打印机在打印这些数字时会忽略它们。 但是当你将它们加在一起时,不准确性就会累积起来,并且这足以在打印结果时显示出来。


Java打印浮点数的方式是您所看到的行为的重要部分:默认情况下,Java不打印浮点数的确切值。 它只打印足够的数字以精确识别正在打印的double

因此,如果将x设置为.3 ,则x实际上设置为0.299999999999999988897769753748434595763683319091796875。 当Java打印时,它仅打印“.3”,因为将“.3”转换为double得到x的值,0.299999999999999988897769753748434595763683319091796875。

当使用.1.2 ,这些实际上是值0.1000000000000000055511151231257827021181583404541015625和0.200000000000000011102230246251565404236316680908203125。 当你添加它们时( double格式),结果是0.3000000000000000444089209850062616169452667236328125。

当您打印此值时,Java会打印“0.30000000000000004”,因为它需要显示所有这些数字才能生成一个数字,当转换回double ,将生成0.3000000000000000444089209850062616169452667236328125。


这里是double值打印的文档。 它说:

必须为小数部分打印多少位数...? 必须至少有一位数字来表示小数部分,并且除此之外还需要多少位数,但只需要多少位数来唯一地区分参数值和类型为double相邻值。

链接地址: http://www.djcxy.com/p/4717.html

上一篇: point maths query

下一篇: How dangerous is it to compare floating point values?