求和值时的Javascript舍入问题
可能重复:求和值时的Javascript舍入问题,javascript,floating-point,floating-accuracy,Javascript,Floating Point,Floating Accuracy,可能重复: 用户在前两个文本框中输入值,在输入时,使用Javascript(对不起,没有jQuery,我还不懂)计算精确的和,并将和四舍五入到2位 为什么会出现舍入错误?我可以做些什么来纠正它 非常感谢 嗯……你是说什么?错误的数据类型 我想知道的是,如果精确的答案被添加到计算器上。我可以使用parseDecimal或其他数据类型吗 !![在此处输入图像描述][1] function SumValues() { //debugger; var txtSu
用户在前两个文本框中输入值,在输入时,使用Javascript(对不起,没有jQuery,我还不懂)计算精确的和,并将和四舍五入到2位 为什么会出现舍入错误?我可以做些什么来纠正它 非常感谢 嗯……你是说什么?错误的数据类型 我想知道的是,如果精确的答案被添加到计算器上。我可以使用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
为了按照您想要的方式修正加法,我建议以某种方式计算每个数字的小数位数,然后将最大值传递给toFixed,并修剪任何剩余的零
function AddTwo(n1, n2) {
var n3 = parseFloat(n1) + parseFloat(n2);
var count1 = Decimals(n1, '.');
var count2 = Decimals(n2, '.');
var decimals = Math.max(count1, count2);
var result = n3.toFixed(decimals)
var resultDecimals = Decimals(result, '.');
if (resultDecimals > 0) {
return result.replace(/\.?0*$/,'');
}
else {
return result;
}
}
// Included for reference - I didn't write this
function Decimals(x, dec_sep)
{
var tmp=new String();
tmp=x;
if (tmp.indexOf(dec_sep)>-1)
return tmp.length-tmp.indexOf(dec_sep)-1;
else
return 0;
}
这里有一条对于任何在金融领域编写软件(或任何处理金钱的软件)的人来说,都有一条黄金法则:永远不要使用浮动。因此,大多数处理货币的软件只使用整数,并将十进制数表示为数据结构 这里有一种方法: (注意:此函数添加两个看起来像数字的字符串) (附加说明:不进行错误检查以帮助澄清。也不处理负数)
函数addNumberString(a,b){
a=a.分割('.');
b=b.分割('.');
变量a_decimal=a[1]| |“0”;
var b|u decimal=b[1]| |“0”;
diff=a_decimal.length-b_decimal.length;
而(差异>0){
b_十进制+='0';
差异--;
}
而(差值<0){
a_十进制+='0';
diff++;
}
变量十进制位置=十进制长度;
a=a[0]+a_小数;
b=b[0]+b_小数;
var结果=(parseInt(a,10)+parseInt(b,10))+“”;
if(结果长度<十进制位置){
对于(var x=result.length;x您期望的结果是什么?我建议将输入的最大小数位数传递给.toFixed()然后从右边修剪零。20.013。但是如果他们在小数点后输入更多有效数字,计算的总和也应该包括这些数字。使用Windows Calculator进行测试。它显示的是我想要的。我惊讶于这不是一件容易的事。Javascript让我每次都失望。我喜欢你的建议。我一直在想这些术语也是。你或其他人能帮助我理解逻辑吗?这是在提升我的能力……这不是javascript的问题。这是你对浮点数如何工作的误解造成的问题。在任何其他编程语言中,你都会得到相同的结果:C、Perl、Ruby等。编写Windows Calculator的程序员必须进行计算不需要编程语言的帮助,也就是说,数字存储为数据结构,而不是浮点数。
function AddTwo(n1, n2) {
var n3 = parseFloat(n1) + parseFloat(n2);
var count1 = Decimals(n1, '.');
var count2 = Decimals(n2, '.');
var decimals = Math.max(count1, count2);
var result = n3.toFixed(decimals)
var resultDecimals = Decimals(result, '.');
if (resultDecimals > 0) {
return result.replace(/\.?0*$/,'');
}
else {
return result;
}
}
// Included for reference - I didn't write this
function Decimals(x, dec_sep)
{
var tmp=new String();
tmp=x;
if (tmp.indexOf(dec_sep)>-1)
return tmp.length-tmp.indexOf(dec_sep)-1;
else
return 0;
}
function addNumberStrings (a,b) {
a = a.split('.');
b = b.split('.');
var a_decimal = a[1] || '0';
var b_decimal = b[1] || '0';
diff = a_decimal.length - b_decimal.length;
while (diff > 0) {
b_decimal += '0';
diff --;
}
while (diff < 0) {
a_decimal += '0';
diff ++;
}
var decimal_position = a_decimal.length;
a = a[0] + a_decimal;
b = b[0] + b_decimal;
var result = (parseInt(a,10)+parseInt(b,10)) + '';
if (result.length < decimal_position) {
for (var x=result.length;x<decimal_position;x++) {
result = '0'+result;
}
result = '0.'+result
}
else {
p = result.length-decimal_position;
result = result.substring(0,p)+'.'+result.substring(p);
}
return result;
}