почему awk превращает число в строку при выполнении арифметики c? - PullRequest
2 голосов
/ 14 апреля 2020

почему число как 0,4 распознается как числовая переменная, а как 0,3 строковая переменная?

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

output: number= 0.4

input: 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

Что здесь происходит? Как работает арифметика c в awk? любая помощь?

Очевидно, использование кавычек в операторе сравнения (как если бы это были строковые переменные) работает в обоих случаях. Однако в моем коде есть l oop, где я передаю значение для сравнения с bash без кавычек, поэтому мне нужно численное сравнение.

1 Ответ

3 голосов
/ 14 апреля 2020

Видимо, вас смущает плавающая точка:

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, ответ - Нет, и ваша программа logi c затем сообщит, что 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.18f\n", c) }'
string=  0.3
0.300000000000000044
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...