[英]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.