Javascript - 计算错误

时间:2010-12-03 13:03:03

标签: javascript

在Chrome Javascript控制台中,输入以下内容:

3.1 * 3.68

返回的结果是:

11.408000000000001

为什么结果不是:

11.408

3 个答案:

答案 0 :(得分:6)

浮点错误非常正常,这是由于在二进制中表示一些浮点数所固有的问题。

请阅读:What Every Computer Scientist Should Know About Floating-Point Arithmetic

答案 1 :(得分:3)

你可以使用javascript更复杂的toFixed方法:

数字方法

在JavaScript 1.5中实现

ECMAScript版ECMAScript第3版

<强>语法

number.toFixed([digits])

<强>参数

<强>位 小数点后出现的位数;这可以是0到20之间的值,包括0和20,并且实现可以可选地支持更大范围的值。如果省略此参数,则将其视为0.

<强>返回

不使用指数表示法且在小数位后面具有正确位数的数字的字符串表示形式。如有必要,数字将四舍五入,如果需要,小数部分用零填充,以使其具有指定的长度。如果number大于1e + 21,则此方法只调用Number.toString()并以指数表示法返回一个字符串。

<强>抛出

<强>的RangeError 如果数字太小或太大。 0到20之间的值(包括0和20)不会导致RangeError。允许实现也支持更大和更小的值。的类型错误 如果在不是Number的对象上调用此方法。

您的问题使用(3.1 * 3.68).toFixed(3); //11.408

https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Number/toFixed

答案 2 :(得分:2)

“有趣”结果的原因是由于某些数字内部的不精确浮点表示。 3.1 * 3.68导致15位小数,3.11 * 3.68和3.1 * 3.67分别给出预期的4位小数和3位小数。

实际上,当预期结果有3位小数(如.745)且浮点结果为.744999999999999时,此javascript'bug'可能导致舍入错误。 示例:1.9 * 3.55 = 6.744999999999999(应为6.745)。对于财务报表,javascript程序将给出6.74而不是6.75的预期舍入。会计核对是一个令人头痛的问题,即使在1000个案例中发生的情况少于1个。

获得确切结果的一种方法是让javascript程序员对结果进行后期处理,如下所示:

var r=1.9*3.55;
r=r.toFixed(3); //=6.745, knowing that the results should be 3 decimals
r=r.toFixed(2); // round to 2 decimals

令人遗憾的是,今天没有任何javascript引擎可以做到这一点,以达到预期的结果。为了保证精确的十进制算术(至少用于金融用途而不是科学或天文用途),所有javascript引擎需要做的是确定n =(结果中的小数位数)然后在内部浮动上做固定(n)点结果。