Javascript中的舍入问题

Rounding issue in Javascript

本文关键字:问题 舍入 Javascript      更新时间:2023-09-26

我在百分比计算和四舍五入结果方面有以下问题。

如果我使用Math.ceil

var total = 66666;
var test1 = Math.ceil(60 / 100 * total);
var test2 = Math.ceil(23.5 / 100 * total);
var test3 = Math.ceil(14 / 100 * total);
var test4 = Math.ceil(2.5 / 100 * total);

然后test1 + test2 + test3 + test4 = 66664

如果我使用ParseInt

var total = 66666;
var test1 = parseInt(60 / 100 * total);
var test2 = parseInt(23.5 / 100 * total);
var test3 = parseInt(14 / 100 * total);
var test4 = parseInt(2.5 / 100 * total);

然后test1 + test2 + test3 + test4 = 66668

我尝试将我的脚本从Python重写为Javascript,在Python中我没有遇到这样的问题。

如果您阅读文档parseInt如何工作,则会发布问题所在:

parseInt() 函数解析字符串参数并返回一个 指定基数的整数(数学数字的基数 系统)。

语法

parseInt(string, radix);

字符串

要分析的值。如果字符串不是字符串,则将其转换为 一。字符串中的前导空格将被忽略。

基数

一个介于 2 和 36 之间的整数,表示基数(基数 数学数字系统)的上述字符串。指定 10为人类常用的十进制数字系统。总是 指定此参数以消除读取器混淆并保证 可预测的行为。不同的实现产生不同的 未指定基数时的结果。

描述

parseInt 函数将其第一个参数转换为字符串,解析 ,并返回一个整数或 NaN

例:

parseInt(2.1) // returns 2
parseInt(2.9) // returns 2 too
parseInt('2.99') // returns 2

还建议在调用时也传递基数作为参数parseInt

在javascript中四舍五入最好使用是Math.round()函数。

参考资料:

Math.Round()

Javascript parseInt()函数接受字符串作为其参数,而Math.ceil()接受数字。因此,parseInt行将解释如下所示的字符串:

parseInt(60 / 100 * total);
// equivalent to: parseInt("39999.6")

在执行此操作时,他们将去除小数点并返回Math.ceil调用将返回40000 39999。这就是造成差异的原因。