JavaScript定时循环舍入错误

时间:2017-04-30 02:49:25

标签: javascript console.log timedelay

timedLoop(10000, function() {
  health=health-0.1;
  updatecounters();
  console.log(health);
});

Health最初设置为83.3,console.log打印出以下语句:

83.2
83.10000000000001
83.00000000000001
82.90000000000002
82.80000000000003
82.70000000000003
82.60000000000004
82.50000000000004
82.40000000000005

它应该每10秒减少0.1,但似乎存在浮点错误。我知道我可以通过简单地将变量舍入到2位小数来解决这个问题,但为什么会这样呢?

我认为这只是糟糕的编译。如果一个数字有一个终止小数(小于32位)或是理性的,程序应该能够存储确切的值而不是像这样的恶作剧发生。我完全理解为什么乘法和除法会导致浮点误差,但加法和减法不应该导致像这样的错误。

3 个答案:

答案 0 :(得分:0)

你可以在减法后调用.toFixed数字。

let health = 83.3;

setInterval(function() {
  health = (health - 0.1).toFixed(1);
  console.log(health);
}, 500);

但是,.toFixed会将数字转换为字符串,如果需要将其保存为数字,可以使用数字构造函数包装代码:

Number((health - 0.1).toFixed(1));

答案 1 :(得分:0)

问题不在于javascript,但它适用于所有浮点计算,因为0.1和0.2和0.3不能完全表示。

Check this link了解更多信息

答案 2 :(得分:0)

浮点问题只是生活的一部分。你需要学会和他们一起生活。

你可以尝试:

// health (String) is for display, can be values from 100.0 to 0.1
var health = "100.0";
// healthMath (Int) is for calculations. It is an int, not a float. 
var healthMath = 1000;

所以,在你的例子中:

timedLoop(10000, function() {
  healthMath -= 1;
  health = (healthMath / 10).toFixed(1);
  updatecounters();
  console.log(health);
});