好的,所以我们都知道浮点数问题,例如:
0.23 - 1 + 1 = 0.22999999999999998
因为在javascript中,与其他语言不同,所有数字实际上都是浮点数并且没有int / decimal,所以有各种库和变通方法(如BigDecimal)来处理这个问题。最好的讨论here。
我正在创建一个支持浮点数的“数字微调器”控件,显然我不希望用户点击“向上”然后“向下”并获得与他开始时不同的数字,所以我尝试编写一种解决方法 - 一种“addPrecise”方法。
我的想法如下:
toFixed()
醇>
例如:
float #1: 1.23
float #2: -1
正常添加它们会产生0.22999999999999998
但是如果我取最大小数位数,即#1的2位数,并应用toFixed(2)
,我得到0.23
想要的。
我用以下代码完成了这项工作,但我对此并不满意。
function addPrecise(f1, f2){
var floatRegex = /[^\d\-]/;
var f1p = floatRegex.exec(f1.toString()) ? f1.toString().split(floatRegex.exec(f1.toString()))[1].length : 0;
var f2p = floatRegex.exec(f2.toString()) ? f2.toString().split(floatRegex.exec(f2.toString()))[1].length : 0;
var precision = Math.max(f1p,f2p);
return parseFloat((parseFloat(f1) + parseFloat(f2)).toFixed(precision));
}
(值得注意的是,我正在使用正则表达式来找到'浮点',因为在其他语言环境中它可能是逗号而不是句号。我也考虑到了我获得Int的可能性(没有意义)在这种情况下它的精度是0。)
有更干净/更简单/更好的方法吗?
编辑:我还想指出,找到提取小数位数的可靠方法也是问题的一部分。我不确定那里的方法。
答案 0 :(得分:1)
针对此问题的合适解决方案是:
更多详情:
可以仅使用浮点实现上述所有操作,只要注意确保算法在合理范围内使用完全整数(或其他可以在浮点格式中精确表示的值)