Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/jenkins/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在JavaScript中添加和比较两个十进制数_Javascript - Fatal编程技术网

在JavaScript中添加和比较两个十进制数

在JavaScript中添加和比较两个十进制数,javascript,Javascript,我试图添加两个十进制数字(参数可以是数字或在解析之前是数字的字符串),并将结果与resultInput进行比较。问题是系统无法足够准确地表示浮点数。例如,0.1+0.2=0.300000000004。因此,我尝试使用toFixed()方法来使用定点表示法格式化数字。当我运行代码时,我得到了false。不知道我哪里弄错了。如果你有任何想法,请告诉我 函数计算(第一个数字、第二个数字、操作、结果输入){ 设a=parseFloat(firstNumber);//Number() 设b=parseF

我试图添加两个十进制数字(参数可以是数字或在解析之前是数字的字符串),并将结果与
resultInput
进行比较。问题是系统无法足够准确地表示浮点数。例如,
0.1+0.2=0.300000000004
。因此,我尝试使用
toFixed()
方法来使用定点表示法格式化数字。当我运行代码时,我得到了
false
。不知道我哪里弄错了。如果你有任何想法,请告诉我

函数计算(第一个数字、第二个数字、操作、结果输入){
设a=parseFloat(firstNumber);//Number()
设b=parseFloat(secondNumber);//Number()
让c;
设d=parseFloat(resultInput);
console.log(JSON.stringify(`value of d:${d}`);//“value of d:NaN”
开关(操作){
格“+”:
c=a+b;
打破
案例'-':
c=a-b;
打破
案例“*”:
c=a*b;
打破
案例“/”:
if(b===0&&1/b====无穷大){
r=无穷大;
}否则{
r=a/b;
}
打破
违约:
log(`Sorry,error operator:${operation}.`);
}
log(JSON.stringify(`c的值:${c}`);/“c的值:0.300000000000000004”
设f=+c.toFixed(1);
设e=+d.toFixed(1);
log(JSON.stringify(`value of f:${f}`);//“value of f:0.3”
console.log(typeof f);//编号
console.log(JSON.stringify(`value of d:${d}`);//“value of d:NaN”
console.log(typeof d);//编号
console.log(JSON.stringify(`value of e:${e}`);/“value of e:NaN”
console.log(typeof e);//编号
如果(f!==e)返回false;
//如果(!Object.is(f,e))返回false;
返回true;
}

log(calc('0.1','0.2','+','0.3')您可以创建一个函数来测试两个数字是否足够接近,是否可以称为相等,而不是在字符串之间来回转换。你决定一些小的增量,如果数字至少如此接近,你称之为好的

函数几乎(a,b,delta=0.000001){
返回Math.abs(a-b)log(“足够近了吗?”,差不多(0.2+0.1,0.3))
我运行了您的代码好几次,没有问题。我刚刚发现你发布的
'0.3'
,它有一个特殊的字符,看起来像
3
,但它不是
3
。因此,当您想在JS上运行它时,它将显示一个错误。所以你的解决方案是正确的。在这里检查

函数计算(第一个数字、第二个数字、操作、结果输入){
设a=parseFloat(firstNumber);
设b=parseFloat(第二个数字);
设aux=parseFloat(resultInput);
让r;
开关(操作){
格“+”:
r=a+b;
打破
案例'-':
r=a-b;
打破
案例“*”:
r=a*b;
打破
案例“/”:
如果(b!==0){
r=a/b;
}否则{
r=0;
}
打破
违约:
log(`Sorry,error operator:${operation}.`);
}
返回(+r.toFixed(1))==(+aux.toFixed(1));
}

log(calc('0.1','0.2','+','0.3')这不是一个直接的答案,而是关于
toFixed()
和浮点数行为的解释:

toFixed()
返回文本。一个原因是,通常不存在数字,可以表示
toFixed()
的结果。因此,使用此函数仅用于显示,而不用于像这里这样的计算

let f = +c.toFixed(1);
let e = +d.toFixed(1);
toPrecision(18)
可以显示数字的所有相关数字。一些例子:

 (0.1).toPrecision(18) // => 0.100000000000000006
 (0.2).toPrecision(18) // => 0.200000000000000011
 (0.3).toPrecision(18) // => 0.299999999999999989
示例解释了为什么
0.1+0.2
0.3
不同

toFixed(1)
的示例相同:

它没有改变任何内容:
toFixed(1)
格式化数字,
+
符号将其转换回最接近的现有数字

这不是JavaScript问题,而是使用IEEE 754(基于二进制的数字)的基于计算机的浮点数问题。大多数硬件都支持这种浮动

在计算机数学中,通常使用绝对或相对增量值来比较浮点数的相等性。绝对增量的示例:

function isEqual( num1, num2, epsilon )
{
    return Math.abs( num1 - num2 ) <= epsilon;
}

isEqual( 0.1 + 0.2, 0.3, 1e-10 ) // => true

.toFixed()
返回一个字符串,因此需要将其转换回数字<代码>设f=parseFloat(c.toFixed(1))“0.3”==“0.3”//true
。或者我遗漏了什么?不要用引号将数字括起来,它们会变成字符串。字符串的行为与数字不同。我需要它们作为输入。这就是我试图解决的任务的条件。您的
结果
字符串中似乎显示了一些不可见的字符。你可能想考虑解析和<代码>。< <代码> ING >代码>结果< /代码>,以确保准确,但是你能解释一下为什么这个代码是错误的吗?“柯南,我刚刚发现我发布的‘0.3’,它有一个看起来像3但不是3的特殊字符。解决方案是正确的。@JohnJohn三个很好,它的字符代码是51,即ascii 3。字符串被‬和‭包围,这是在双向文本中使用的非打印控制字符。@MarkMeyer这很奇怪,因为当我在ASCII表中检查我的keybord字符时,它会显示
Dec-39 Hex-27 Binary-00100111 HTML-';Char-'Single quote
按其假设返回
true
。我仍然对这个特殊字符感到困惑。但我会尽力去做的。非常感谢。可能有人跟你开了个玩笑。西里尔文大写字母ze看起来像3,unicode十六进制是0x417,你认为我有可能
function isEqual( num1, num2, epsilon )
{
    return Math.abs( num1 - num2 ) <= epsilon;
}

isEqual( 0.1 + 0.2, 0.3, 1e-10 ) // => true
// scan user input:
cent = round( euro * 100 );

// adding cents:
cent3 = cent1 + cent2;

// print cents as euro
(cent/100).toFixed(2)+"€"