【发布时间】:2025-12-15 13:05:02
【问题描述】:
我正在尝试以与 PHP 中相同的方式在 Javascript 中对浮点数进行舍入;但是我不能让两种语言都以同样的方式轮到下面的数字:6.404999999999999
当我使用 PHP 回合时,我得到:6.41,但是当我尝试使用 Javascript 回合时,我总是得到 6.40
信息:正确答案是https://*.com/a/54721202/4359029
我的 Javascript 尝试:
尝试 #1:
module.exports = function round (value, precision, mode) {
var m, f, isHalf, sgn // helper variables
// making sure precision is integer
precision |= 0
m = Math.pow(10, precision)
value *= m
// sign of the number
sgn = (value > 0) | -(value < 0)
isHalf = value % 1 === 0.5 * sgn
f = Math.floor(value)
if (isHalf) {
switch (mode) {
case 'PHP_ROUND_HALF_DOWN':
// rounds .5 toward zero
value = f + (sgn < 0)
break
case 'PHP_ROUND_HALF_EVEN':
// rouds .5 towards the next even integer
value = f + (f % 2 * sgn)
break
case 'PHP_ROUND_HALF_ODD':
// rounds .5 towards the next odd integer
value = f + !(f % 2)
break
default:
// rounds .5 away from zero
value = f + (sgn > 0)
}
}
return (isHalf ? value : Math.round(value)) / m
}
摘自:http://locutus.io/php/math/round/
尝试 #2:
round(decimal: number, decimalPoints: number): number{
let roundedValue = Math.round(decimal * Math.pow(10, decimalPoints)) / Math.pow(10, decimalPoints);
console.log(`Rounded ${decimal} to ${roundedValue}`);
return roundedValue;
}
摘自:https://*.com/a/50918962/4359029
我尝试了其他解决方案...但没有成功。
有人能告诉我如何让 Javascript 的四舍五入像 PHP 一样吗?
你能告诉我为什么在我解释的情况下它们以不同的方式工作吗?
【问题讨论】:
-
这可能是因为 PHP 确实具有数字的准确二进制表示,并且知道该数字实际上是
6.405,但无法以十进制准确显示。 this is a good read about this 问题在于,很可能当您将该数字的十进制表示发送到 JavaScript 时,准确的二进制表示会丢失,并且 JavaScript 必须处理嘈杂的数据。我怀疑除了将操作发送到 JavaScript 并让它从头开始计算之外还有什么可做的
标签: javascript php math rounding