【发布时间】:2012-07-31 00:36:38
【问题描述】:
用户在前两个文本框中输入值,然后在输入时使用 Javascript(抱歉,没有 jQuery,我还没有做到这一点)来计算精确的总和并将总和四舍五入为 2 位数。
为什么会出现舍入错误,我可以做些什么来纠正它?
非常感谢。
嗯....ParseFloat?错误的数据类型?
我想看看精确的答案是否就像添加在计算器上一样。我可以使用 parseDecimal 或其他数据类型吗?
![在此处输入图片描述][1]
function SumValues() {
//debugger;
var txtSubsContrRbtAmt = document.getElementById("<%=txtSubsContrRbtAmt.ClientID%>");
var txtDeMinAmt = document.getElementById("<%=txtDeMinAmt.ClientID%>");
var txtTotRbtAmt = document.getElementById("<%=txtTotRbtAmt.ClientID%>");
var txtRndRbtAmt = document.getElementById("<%=txtRndRbtAmt.ClientID%>");
var total = Add(txtSubsContrRbtAmt.value, txtDeMinAmt.value);
txtTotRbtAmt.value = total;
txtRndRbtAmt.value = RoundToTwoDecimalPlaces(total);
}
function Add() {
var sum = 0;
for (var i = 0, j = arguments.length; i < j; i++) {
var currentValue;
if (isNumber(arguments[i])) {
currentValue = parseFloat(arguments[i]);
}
else {
currentValue = 0;
}
sum += currentValue;
}
return sum;
}
function RoundToTwoDecimalPlaces(input) {
return Math.round(input * 100) / 100
}
function IsNumeric(input) {
return (input - 0) == input && input.length > 0;
}
function isNumber(n) {
return !isNaN(parseFloat(n)) && isFinite(n);
}
[1]: http://i.stack.imgur.com/5Otrm.png
更新。我正在评估这样的事情:
function AddWithPrecision(a, b, precision) {
var x = Math.pow(10, precision || 2);
return (Math.round(a * x) + Math.round(b * x)) / x;
}
【问题讨论】:
-
你期望的结果是什么?
-
我建议将输入的最大小数位数传递给 .toFixed() 然后从右侧修剪零。
-
20.013。但如果他们在小数点后输入了更多有效数字,计算的总和也应该包括这些数字。使用 Windows 计算器进行测试。它所显示的,就是我想要的。我惊呆了,这不是一件容易的事。 Javascript 每次都让我失望。
-
我喜欢你的建议。我也在考虑这些条款。你或有人能帮忙解释一下逻辑吗?这正在推动我的能力......
-
不是javascript的问题。这是您对浮点数如何工作的误解的问题。在任何其他编程语言中都会得到相同的结果:C、Perl、Ruby 等。编写 Windows 计算器的程序员必须在没有编程语言帮助的情况下进行计算。也就是说,数字存储为数据结构而不是浮点数。
标签: javascript floating-point floating-accuracy