繁体   English   中英

Javascript中模数运算符不准确

[英]Modulo operator innaccuracy with large numbers in Javascript

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

用户输入一个数字(var innum ),模运算符与10,000的除数一起使用,以查明我希望用汉字(汉字)标记的数字的4位数据块。

例如:其中chobase = 10 ^ 12(一万亿), okubase = 10 ^ 8(一亿)和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。

我会考虑尽可能将它们保留为字符串 ,然后仅使用子字符串操作来操纵它们。 然后,您不必担心它们是否适合数字数据类型。

通过示例,考虑以下脚本:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM