【问题标题】:Rounding in Javascript toFixed() method [duplicate]Javascript toFixed() 方法中的舍入[重复]
【发布时间】:2019-11-14 04:28:15
【问题描述】:

我知道javascript中的toFixed()方法将数字转换为字符串,保持指定的小数位数,就像下面的代码一样,设置后面的位数小数点为 2 .

我的问题是:数字是否在必要时四舍五入。在下面的代码中,我将转换数字:0.075。我认为四舍五入 0.075 应该是 0.08 作为“5 上升”。但是,在下面的第一种情况下,它看起来很奇怪。所以我很困惑。

var a=0.25*0.3;
var res1 = a.toFixed(2);
console.log(res1);
//Output: a is 0.07 (Is there something wrong?)

var b=0.025*3;
var res2= b.toFixed(2);
console.log(res2);
//Output:b is 0.08

我知道这个问题可以通过使用 Math.js 来解决。但是,我只是想知道问题的原因?是toFixed()方法的问题还是javascript中的数据类型的问题。

【问题讨论】:

  • 是的,第二个。试试.toFixed(22),你就会明白为什么
  • 无法复制。
  • 我假设第二个代码块应该有var b=0.025*3;
  • 这对我来说看起来很奇怪 - 为什么 b.toFixed(2) 应该返回 0.08b = 0.0075
  • b.toFixed(2); 是 0.08???呵呵,我没看到.0075 会是.01

标签: javascript decimal rounding


【解决方案1】:

the docs 中所述,toFixed() 在必要时进行舍入。舍入行为是在数字的 -.5

您观察到的奇怪行为与上面链接的文档中的注释一致:

浮点数不能以二进制精确表示所有小数,这可能会导致意外结果,例如 0.1 + 0.2 === 0.3 返回 false 。

换句话说,这是浮点精度损失的典型案例——几乎任何语言都会遇到这个问题。如果您观察 ab 的完整输出,您将看到 a == 0.075b == 0.07500000000000001 由于浮点精度 - 因此给定这些值与定义的舍入行为一致以舍入 a.07b.08

【讨论】:

  • 非常感谢。您能否解释一下 toFixed() 的舍入规则。因为我不认为是银行四舍五入,将值四舍五入到最接近的偶数,否则就是a==0.075=0.8。我还尝试打印toFixed(22),显示:a=0.0749999999999999972244 b=0.0750000000000000111022 这和这个奇怪的案例有关吗?
  • 就像我上面写的那样,换句话说,直到0.5(包括0.5)的小数部分向下舍入到较小的整数,即使是0.5之后的最小分数也向上舍入到较大的整数。我不确定 toFixed 究竟是如何工作的,但看起来你要求它显示比默认显示量更高的精度,这揭示了许多有效数字的精度损失。它在某种意义上是相关的,你可以清楚地看到 a 0.75 这就是为什么它们在不同的方向上圆形
  • 是的,我明白了。我认为,正如您所说,计算机中并不总是“四舍五入”,这意味着存在一些情况,例如:0.555=0.55, 1.555=1.56。
【解决方案2】:

您遇到的问题不是 JavaScript 特有的,它在一般计算中很常见。

这两种算术计算的结果相同——0.075:

  • 0.25 * 0.3 = 0.075
  • 0.025 * 3 = 0.075

这是使用常用的十进制数系统。

然而,计算机的核心不是十进制,而是二进制——一切都基于 0 和 1。

因此,他们实际上很难正确计算上述计算。 JavaScript 和其他编程语言必须近似结果,给你这个:

  • 0.25 * 0.3 = 0.75
  • 0.025 * 3 = 0.07500000000000001

您现在可以看到为什么toFixed 返回不同的结果了:

  • 0.75.toFixed(2) = 0.07
  • 0.07500000000000001.toFixed(2) = 0.08

【讨论】:

  • 是的!但我想知道为什么 0.075.toFix(2)= 0.07,是因为 0.075 实际上是 0.7499999 ..... 而 toFixed() 使用“5 go up”将其四舍五入?
  • 我认为这是因为四舍五入的方式是1-5向下舍入,6-9向上舍入,但我只能推测,不是专家
猜你喜欢
  • 2021-07-26
  • 1970-01-01
  • 1970-01-01
  • 2012-09-27
  • 1970-01-01
  • 1970-01-01
  • 2019-09-15
  • 2018-01-31
相关资源
最近更新 更多