1.265 * 10000 = 126499.99999999999?
这个问题在这里已经有了答案:
在所有情况下,浮点数都不能正确处理小数。 查看
你应该知道,计算机中的所有信息都是二进制的,不同基地的分数的扩展是不同的。
例如,基数10中的1/3 = .33333333333333333333333333,而基数3中的1/3等于.1,基数2中的1/3等于.0101010101010101。
如果您不完全了解不同基地的工作原理,请参阅以下示例:
基地4号码301.12。 将等于3 * 4 ^ 2 + 0 * 4 ^ 1 + 1 * 4 ^ 0 + 1 * 4 ^ -1 + 2 * 4 ^ -2 = 3 * 4 ^ 2 +1+ 1 * 4 ^ -1 + 10 * 4 ^ -2 = 49.375。
现在浮点数的准确性问题来自有效数字中的有限位数。 浮点数有3个部分,符号位,指数和尾数,很可能javascript使用32位或64位IEEE 754浮点标准。 为了更简单的计算,我们将使用32位,所以浮点数为1.265
0的符号位(0表示正数,1表示负数)指数为0(其中127偏移量将是,即指数+偏移量,所以无符号二进制中的127)01111111(最后我们得到1.265的signifcand,ieee浮点数标准使用隐藏的1表示,所以我们的1.265的二进制表示是1.01000011110101110000101,忽略了1 :) 01000011110101110000101。
因此,我们最终的IEEE754单一(32位)表示为1.625:
Sign Bit(+) Exponent (0) Mantissa (1.625)
0 01111111 01000011110101110000101
现在1000将是:
符号位(+)指数(9)尾数(1000)0 10001000 11110100000000000000000
现在我们必须乘以这两个数字。 浮点乘法包括将隐藏1重新添加到两个尾数,乘以两个尾数,从两个指数中减去偏移量,然后将这两个指数相加在一起。 在这之后,尾数必须再次正常化。
第一个1.01000011110101110000101 * 1.11110100000000000000000 = 10.0111100001111111111111111000100000000000000000(这个乘法很痛苦)
现在显然我们有一个9 +的指数为0的指数,所以我们保持10001000作为指数,并且我们的符号位保持不变,所以剩下的就是归一化。
我们需要我们的尾数为1.000000,所以我们必须将其右移一次,这也意味着我们必须增加指数,使我们达到10001001,现在我们的尾数被归一化为1.00111100001111111111111111000100000000000000000。 它必须被截断为23位,所以我们留下了1.00111100001111111111111(不包括1,因为它将隐藏在我们的最终表示中),所以我们留下的最终答案是
Sign Bit (+) Exponent(10) Mantissa
0 10001001 00111100001111111111111
最后,如果我们将这个答案转换回十进制,我们得到(+)2 ^ 10 *(1 + 2 ^ -3 + 2 ^ -4 + 2 ^ -5 + 2 ^ -6 + 2 ^ -11 + 2 ^ -12 + 2 ^ -13 + 2 ^ -14 + 2 ^ -15 + 2 ^ -16 + 2 ^ -17 + 2 ^ -18 + 2 ^ -19 + 2 ^ -20 + 2 ^ -21 + 2 ^ -22 + 2 ^ -23)= 1264.99987792
虽然我确实简化了1000乘以1.265而不是10000的问题,并且使用单浮点而不是双精度,但概念保持不变。 您使用丢失的准确性,因为浮点表示在尾数中只有很多位用来表示任何给定的数字。
希望这可以帮助。
这是浮点表示错误的结果。 并非所有具有有限小数表示的数字都具有有限的二进制浮点表示。
链接地址: http://www.djcxy.com/p/27449.html上一篇: 1.265 * 10000 = 126499.99999999999?
下一篇: Why does adding two decimals in Javascript produce a wrong result?