我们注意到这种情况在javascript和VB.net 2.0中同时发生。所以基本上在服务器端和客户端代码。
基本上如果您运行此公式975328 - 153279.43,您将得到以下答案822048.57000000007。
但是,如果您运行975328 - 153279.4,975328 - 153279.433或975328 - 153279.5,则所有内容都会正确返回。
任何想法都必须为什么系统计算975328 - 153279.43并得到11位小数的答案?更不用说在第11个小数位上添加7,从而使方程式回答不正确。
当然我知道我可以修剪,设置适当的小数位等等的答案,但我们更感兴趣的是知道为什么它会返回这样的答案。
请记住,只需将方程式输入到immidiate窗口中即可证明以上内容,从而消除了诸如对象类型等的变量等。
感谢您的帮助, 肯
答案 0 :(得分:5)
出于同样的原因,你无法准确地将1/3表示为小数(基数为10)。您可以在基数10中输入数字,但所有算术都在基数2(二进制)中进行。因此,必须首先将基数10值转换为基数2,并且如果甚至可以准确地表示二进制数字,则最终可能需要更多的位来表示它,而不是用于标准的双重类型。
调查此错误的另一个常见数字是.1。转换为二进制时,任何带小数的十进制数都会在小数点后永久重复。因此,没有办法准确地表达二进制值。
在VB.Net中,你至少可以使用Decimal类型来处理这种事情。 IT很多,很多慢,但它应该准确地处理这种计算。我不确定javascript解决方案是什么。
答案 1 :(得分:1)
您需要注意浮点数只有固定的精度。您无法通过浮点正确显示所有数字,因此某些计算可能会导致这种不精确的“浮出水面”
浮点数表示为“int”+ a bitshift ...
看看这里:http://en.wikipedia.org/wiki/Floating_point
内部表示浮点数通常从左到右打包到计算机数据中作为符号位,指数字段和有效数字(尾数)。对于IEEE 754二进制格式,它们按如下方式分配:
Type Sign Exponent Significand Total bits Exponent bias Bits precision Half 1 5 10 16 15 11 (IEEE 754-2008) Single 1 8 23 32 127 24 Double 1 11 52 64 1023 53 Quad 1 15 112 128 16383 113
答案 2 :(得分:1)
Javascript使用float数据类型来存储这些值,总而言之,float数据类型不会在内存中存储确切的数字。通常,最好使用整数来执行计算,然后你总是可以除以100.0 来强制转换为你想要的任何小数点。或者,您可以在对象上使用 toFixed(DECIMAL_PLACES)将其四舍五入到您希望的小数点。