我试图以与在PHP中相同的方式对Javascript中的浮点数进行取整;但是我无法用以下数字以相同的方式使两种语言一致:6.404999999999999
当我使用PHP进行舍入时,会得到:6.41
,,但是当我尝试使用Javascript进行舍入时,总会得到6.40
我的Javascript尝试:
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/
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://stackoverflow.com/a/50918962/4359029
我尝试了其他解决方案...但是没有成功。
有人可以告诉我如何使Java的四舍五入像PHP一样吗?
您能告诉我为什么在我解释的情况下它们以不同的方式起作用吗?
答案 0 :(得分:4)
您可以使用toPrecision功能
它将以提供的precision
进行四舍五入。在这里,我将4
舍入以获得6.405
,然后将3
舍入以获得6.41
parseFloat((6.404999999999999).toPrecision(4)).toPrecision(3);
console.log(parseFloat((6.404999999999999).toPrecision(4)).toPrecision(3));
答案 1 :(得分:2)
您可以这样做:
function roundToXDigits(value, digits)
{
if (!digits) {
digits = 2;
}
value = value * Math.pow(10, digits);
value = Math.round(value);
value = value / Math.pow(10, digits);
return value
}
var num = roundToXDigits(6.404999999999999, 3); //creates 6.405
console.log(roundToXDigits(num, 2)); //creates 6.41
问题是技术上并没有错。四舍五入时,6.4049->变为6.405(2dp为6.40),这就是为什么它无法按预期工作的原因。您必须运行功能两次舍入到405-> 41。
来源:JavaScript math, round to two decimal places
^^布赖斯答案的扩展用法。
答案 2 :(得分:0)
您可以尝试
console.log(Number(n.toFixed(3)).toFixed(2));
例如
var n = 6.404999999999999;
console.log(n.toFixed(2)); //=> 6.40
console.log(n.toFixed(3)); //=> 6.405
答案 3 :(得分:0)
我认为下一个正确答案:
function roundLikePHP(num, dec){
var num_sign = num >= 0 ? 1 : -1;
return parseFloat((Math.round((num * Math.pow(10, dec)) + (num_sign * 0.0001)) / Math.pow(10, dec)).toFixed(dec));
}
我用1.015
尝试了其他解决方案,但未按预期工作。
此解决方案可以很好地工作,就像PHP回合一样,可以使用我尝试过的所有数字。