在Java中舍入toFixed()方法

时间:2019-11-13 16:16:15

标签: javascript decimal rounding

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

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

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中的数据类型的问题。

2 个答案:

答案 0 :(得分:1)

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

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

  

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

换句话说,这是浮点精度损失的经典情况-几乎所有语言都将遇到这个问题。如果您观察到ab的完整输出,则由于浮点精度,您会看到a == 0.075b == 0.07500000000000001-因此给定这些值,它与定义了将a舍入到.07并将b舍入到.08的舍入行为。

答案 1 :(得分:1)

您遇到的问题不是特定于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