如何像PHP一样在javascript中取整

如何像PHP一样在javascript中取整,javascript,php,math,rounding,Javascript,Php,Math,Rounding,我试图在Javascript中对一个浮点数进行四舍五入,就像在PHP中一样;但我不能同时掌握两种语言​​以相同的方式将以下数字四舍五入:6.4049999999999 当我使用PHP时,我得到:6.41,但是当我尝试使用Javascript时,我总是得到6.40 信息:正确答案是 我的Javascript尝试: 尝试#1: 摘自: 我尝试了其他解决方案。。。但是没有成功 有人能告诉我如何让Javascript的四舍五入像PHP一样工作吗 你能告诉我为什么在我解释的情况下它们以不同的方式工作吗?

我试图在Javascript中对一个浮点数进行四舍五入,就像在PHP中一样;但我不能同时掌握两种语言​​以相同的方式将以下数字四舍五入:
6.4049999999999

当我使用PHP时,我得到:
6.41
但是当我尝试使用Javascript时,我总是得到
6.40

信息:正确答案是

我的Javascript尝试:

尝试#1: 摘自:


我尝试了其他解决方案。。。但是没有成功

有人能告诉我如何让Javascript的四舍五入像PHP一样工作吗

你能告诉我为什么在我解释的情况下它们以不同的方式工作吗?

你可以试试

console.log(Number(n.toFixed(3)).toFixed(2));
例如

var n=6.40499999999;
console.log(n.toFixed(2));//=>6.40

console.log(n.toFixed(3));//=>6.405
您可以这样做:

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
问题是,JavaScript在技术上并没有错。6.4049->当您四舍五入时变为6.405(2dp为6.40),这就是为什么它不能按预期工作。您必须运行函数两次才能进行第405->41轮

资料来源:

^^布莱斯答案的扩展用法。

您可以使用函数

它将按提供的
精度进行四舍五入。这里我四舍五入
4
得到
6.405
,然后四舍五入
3
得到
6.41

parseFloat((6.404999999999999).toPrecision(4)).toPrecision(3);

console.log(parseFloat((6.4049999999999).toPrecision(4)).toPrecision(3))我认为最好的答案是下一个:

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 round一样,我尝试了所有的数字。

@tomloprod没问题,希望它有帮助:)treyBake工作得很好!我认为它类似于@C2486答案。伙计们,你们认为什么样的解决方案是最好的?@tomloprod:深入探索任何方法总是好的,但最佳实践是使用任何语言或框架提供的内置方法。很高兴看到
toPrecision
的详细代码为
roundToXDigits
。如果任何版本的浏览器都不支持内置方法,则此
roundToXDigits
方法将非常有用。@treyBake您能解释一下为什么您的解决方案不能与下一个数字配合使用:
1.015
?这将取而代之的是
1.01
而不是
1.02
@tomloprod此解决方案不适用于1.015,因为在JS 1.015*100=101.49999999999999中,这可能是因为PHP确实有一个精确的二进制数字表示,并且知道该数字实际上是
6.405
,但无法以十进制精确显示。问题是,当您将该数字的十进制表示形式发送给JavaScript时,准确的二进制表示形式将丢失,JavaScript必须处理嘈杂的数据。我怀疑除了将ops发送到JavaScript并让它从中进行计算之外,还有什么别的事情要做scratch@RokoC.Buljan,PHP中的round方法和javascript中的round方法有一个根本的区别。但是根据round功能的基本定义,这些值等于JavaScript的结果
您能解释一下为什么您的解决方案不能与下一个数字配合使用:
1.015
?这将轮到
1.01
而不是
1.02
最佳答案!:)感谢@tomloprod虽然这个函数与php函数很接近,但在某些情况下它仍然返回不同的结果。例如roundLikePHP(0.49999,0)=1,而在php中round(0.49999)=0。@Andyba Hi。这个问题只在四舍五入到小数点后0位时才会发生,所以至少在我的情况下,它不会影响me@tomloprod不完全是:roundLikePHP(0.00499999,2)=0.01,在php中round(0.00499999,2)=0
parseFloat((6.404999999999999).toPrecision(4)).toPrecision(3);
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));
}