gpt4 book ai didi

javascript 正确四舍五入到两位小数,不可能吗?

转载 作者:可可西里 更新时间:2023-11-01 02:33:27 24 4
gpt4 key购买 nike

在 php 中,我们有 number_format()。传递一个值,例如:

number_format(3.00 * 0.175, 2);

返回 0.53,这是我所期望的。

但是,在 JavaScript 中使用 toFixed()

var num = 3.00 * 0.175;
num.toFixed(2);

返回 0.52

好吧,也许 toFixed 不是我想要的......也许是这样的......

var num = 3.17 * 0.175;
var dec = 2;
Math.round( Math.round( num * Math.pow( 10, dec + 1 ) ) / Math.pow( 10, 1 ) ) / Math.pow(10,dec);

不,那也行不通。它将返回 0.56。

如何在 JavaScript 中获得一个不给出错误答案的 number_format 函数?

实际上我确实找到了 number_format 的 js 实现,http://phpjs.org/functions/number_format , 但它也有同样的问题。

JavaScript 舍入是怎么回事?我错过了什么?

最佳答案

JavaScript 在处理 float 方面表现不佳(许多其他语言也是如此)。

当我运行时

3.000 * 0.175

在我的浏览器中,我得到

0.5249999999999999

Math.round 不会四舍五入到 0.525。为了避免这种情况,您必须将两边相乘,直到它们成为整数(相对容易,不过知道一些技巧会有所帮助)。

所以要做到这一点,我们可以这样说:

function money_multiply (a, b) {
var log_10 = function (c) { return Math.log(c) / Math.log(10); },
ten_e = function (d) { return Math.pow(10, d); },
pow_10 = -Math.floor(Math.min(log_10(a), log_10(b))) + 1;
return ((a * ten_e(pow_10)) * (b * ten_e(pow_10))) / ten_e(pow_10 * 2);
}

这可能看起来有点古怪,但这里有一些伪代码:

get the lowest power of 10 of the arguments (with log(base 10))
add 1 to make positive powers of ten (covert to integers)
multiply
divide by conversion factor (to get original quantities)

希望这就是您要找的。这是一个示例运行:

3.000 * 0.175
0.5249999999999999

money_multiply(3.000, 0.175);
0.525

关于javascript 正确四舍五入到两位小数,不可能吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3081631/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com