导致不正确舍入的 JS 浮点数 - Math.round() 总是有效?
JS floating point causing incorrect rounding - Math.round() always works?
乘法后我有带浮点数的边缘情况。
我必须将数字四舍五入到最接近的百位,但在这种情况下:
115000*4.35 //500249.99999999994
我会得到一个错误的结果:
Math.round(115000*4.35 / 100) * 100 //500200
而不是500300
解决方案:
第一次四舍五入到最接近的小数点后一位:
Math.round(500249.99999999994 * 10) / 10 //200250,
然后四舍五入到最近的百位:
Math.round(500250 / 100) * 100 //200300
合并:
Math.round(Math.round(num * 10) / 1000) * 100
有谁知道这是否是一种安全的解决方法?它总是有效吗?
提前致谢!
四舍五入到最接近的整数可以简单地通过调用
来完成
Math.round(500249.99999999994)
所以四舍五入到最近的百位变成:
const num = 115000*4.35;
const roundedToNearestHundred = Math.round(Math.round(num) / 100) * 100;
console.log(roundedToNearestHundred);
Does anyone know if it's a safe way to solve it? Does it always work?
它不安全,并不总是有效。
考虑 100,005 • 9.99。在实际算术中,这是 999,049.95,您显然希望将它四舍五入到最接近的 100 的倍数,得到 999,000。
9.99 不能存储在 JavaScript 号码中。最接近的可表示值是 9.9900000000000002131628207280300557613372802734375。在 JavaScript 的浮点运算中将其乘以 100.005 得到 999,049.950000000069849193096160888671875.
您提出的解决方案首先尝试将其四舍五入为最接近的 1/10 的倍数。在本例中,它成功了,产生了 999,050。 (在许多情况下,这会失败,因为可以表示的 1/10 的唯一倍数是 5/10 的倍数。)然后使用 Math.round(999050 / 100) * 100)
产生 999,100(因为 Math.round
轮到一半的情况向上)。
即使使用实数运算而不是浮点运算,您提出的解决方案也不会奏效。使用相同的方法(一半的情况)将 999,049.95 舍入到最接近的 1/10 的倍数得到 999,050,并将其舍入到最接近的 100 的倍数得到 999,100。
乘法后我有带浮点数的边缘情况。
我必须将数字四舍五入到最接近的百位,但在这种情况下:
115000*4.35 //500249.99999999994
我会得到一个错误的结果:
Math.round(115000*4.35 / 100) * 100 //500200
而不是500300
解决方案:
第一次四舍五入到最接近的小数点后一位:
Math.round(500249.99999999994 * 10) / 10 //200250,
然后四舍五入到最近的百位:
Math.round(500250 / 100) * 100 //200300
合并:
Math.round(Math.round(num * 10) / 1000) * 100
有谁知道这是否是一种安全的解决方法?它总是有效吗?
提前致谢!
四舍五入到最接近的整数可以简单地通过调用
来完成Math.round(500249.99999999994)
所以四舍五入到最近的百位变成:
const num = 115000*4.35;
const roundedToNearestHundred = Math.round(Math.round(num) / 100) * 100;
console.log(roundedToNearestHundred);
Does anyone know if it's a safe way to solve it? Does it always work?
它不安全,并不总是有效。
考虑 100,005 • 9.99。在实际算术中,这是 999,049.95,您显然希望将它四舍五入到最接近的 100 的倍数,得到 999,000。
9.99 不能存储在 JavaScript 号码中。最接近的可表示值是 9.9900000000000002131628207280300557613372802734375。在 JavaScript 的浮点运算中将其乘以 100.005 得到 999,049.950000000069849193096160888671875.
您提出的解决方案首先尝试将其四舍五入为最接近的 1/10 的倍数。在本例中,它成功了,产生了 999,050。 (在许多情况下,这会失败,因为可以表示的 1/10 的唯一倍数是 5/10 的倍数。)然后使用 Math.round(999050 / 100) * 100)
产生 999,100(因为 Math.round
轮到一半的情况向上)。
即使使用实数运算而不是浮点运算,您提出的解决方案也不会奏效。使用相同的方法(一半的情况)将 999,049.95 舍入到最接近的 1/10 的倍数得到 999,050,并将其舍入到最接近的 100 的倍数得到 999,100。