为什么awk在做算术时会把数字变成字符串



为什么0.4这样的数字被识别为数字变量,而0.3被识别为字符串变量?

输入:echo | awk '{ c=0.1+0.3; if (c==0.4) {print "number= ", c} else {print "string= ", c} }'

输出:number= 0.4

输入:echo | awk '{ c=0.1+0.2; if (c==0.3) {print "number= ", c} else {print "string= ", c} }'

输出:string= 0.3

输入:echo | awk '{ c=0.1+0.3; if (c=="0.4") {print "string= ", c} else {print "number= ", c} }'

输出:string= 0.4

输入:echo | awk '{ c=0.1+0.2; if (c=="0.3") {print "string= ", c} else {print "number= ", c} }'

输出:string= 0.3

这里发生了什么?算术在awk中是如何工作的?有什么帮助吗?

显然,在比较语句中使用引号(就好像它是字符串变量一样(在这两种情况下都有效。然而,在我的代码中有一个循环,我在其中传递来自bash的值以进行比较,而不带引号,所以我需要数字比较。

您显然被浮点混淆了:

echo | awk '{ c=0.1+0.2; 
if (c > 0.3) {print "number= ", c} 
else {print "string= ", c} 
}'

输出

number= 0.3

怎么回事?当你把0.1加到0.2时,你不会得到精确的0.3。如果您询问结果是否恰好是0.3,答案是否,然后您的程序逻辑报告c是一个字符串。但事实并非如此;这是一个比0.3大一根头发的数字。Vis:

$ echo | awk '{ c=0.1+0.2; if (c==0.3) {print "number= ", c} 
else {print "string= ", c}}  END { printf("%18.18fn", c) }'
string=  0.3
0.300000000000000044

最新更新