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位)或是理性的,程序应该能够存储确切的值而不是像这样的恶作剧发生。我完全理解为什么乘法和除法会导致浮点误差,但加法和减法不应该导致像这样的错误。
答案 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);
});