在Javascript中使用大数字的模运算符不精确

时间:2015-03-27 05:23:59

标签: javascript numbers modulo floating-point-precision

我正在编写一些代码,用于将大整数从基于千的系统(例如1,234,567,891)转换为日本的万系统(例如12亿3456万7891)。简而言之,用日语将数字写成可读格式意味着将数字分成四组而不是三组。

用户输入一个数字(var innum),模数运算符与10,000的除数一起使用,以精确定位我想要用汉字(汉字)标记的数字的4位数字块。

例如: 其中chobase = 10 ^ 12(一万亿),okubase = 10 ^ 8(1亿)和manbase = 10000(万),并说用户输入是54234238524003:

var cho = Math.floor((innum/chobase));            //returns 54
var oku = Math.floor(((innum%chobase)/okubase));  //returns 2342
var man = Math.floor(((innum%okubase)/manbase));  //returns 3852
var sen = (innum%manbase);                        //returns 4003

将它们串起来作为一个字符串和... 54兆2342亿3852万4003
非常好 - 效果很好。

然而,当整数提示为十四进制(10 ^ 16)时,模运算符不再可靠。

使用与上面相同的逻辑代码生成的示例(为了便于阅读而添加了逗号):

  

输入:4,234,322,423,423,424,003
  产量:423京4322兆4234亿2342万4000

这是不正确的,因为在给定输入的情况下,日语格式的后四位数应为4003。

我意识到JavaScript数字是浮点数,并且当整数达到一定大小时精度会下降,那么有没有关于如何解决大小数十个四十亿次数的问题的建议? (这大致是我想要转换的最大尺寸数)。我看到php有一个fmod()方法来处理这种情况,但我一直无法找到一个等效的javascript ..

1 个答案:

答案 0 :(得分:2)

如果可能的话,我会考虑将它们保留为 strings ,然后只使用子字符串操作来操作它们。那么你不必担心他们是否适合数字数据类型。

举例来说,请考虑以下脚本:

function makeNum(num) {
    num = num.replace(/,/g,"");
    var markers = "万億兆京";
    var result = "";
    while (num.length > 4) {
        if (markers.length == 0) {
            result = "(未詳)" + num.substr(num.length-4) + result;
        } else {
            result = markers.substr(0, 1) + num.substr(num.length-4) + result;
            markers = markers.substr(1);
        }
        num = num.substr(0, num.length-4);
    }
    return num + result;
}

alert(makeNum("4,234,322,423,423,424,003"));

首先删除所有逗号,然后逐节构建日语编号,使用markers选择正确的分隔符。如果您的号码太大以至于标记用完了,我只需使用(未詳)代替,如果意味着"未知",您可以责备我使用的日语 - 英语在线词典。

正如预期的那样,该脚本的结果是一个包含423京4322兆4234億2342万4003的对话框。

相关问题