javascript和VB.net返回不正确的结果

时间:2010-11-17 16:20:36

标签: javascript vb.net .net-2.0

我们注意到这种情况在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窗口中即可证明以上内容,从而消除了诸如对象类型等的变量等。

感谢您的帮助, 肯

3 个答案:

答案 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)将其四舍五入到您希望的小数点。