Bash

bash calc 返回 800(應該是 600): echo ‘$(( 800 / (4 / 3) ))’

  • May 17, 2022

我從x數字計算縱橫比高度,在這個例子中我使用 4:3 比例,寬度為 800,結果(高度)應該是 600,但是 bash 返回 800,我不知道為什麼.

我嘗試過其他語言,大多數似乎也有問題,php 似乎是少數可以工作的語言之一。

PHP(返回 600)

php -r 'echo 800/(4/3);'

Python(返回 800)

python -c "print(800/(4/3))"

bc -l有點工作(返回 600.000000000000000000150)

-l是“定義標準數學庫”,不確定這意味著什麼,但它似乎讓我更接近我的目標,但額外的 0 和 150 來自哪裡?

echo '800 / (4 / 3)' | bc -l

我猜這與浮點處理或截斷3/4.

現在我可以使用php, 並收工,但對於一個相對簡單的計算來說似乎有點矯枉過正。知道這裡發生了什麼。

Bash 算術只是整數。所以 4/3 返回 1。而 800/1 是 800。

如果您可以控制輸入,那麼您可以在除法之前重新考慮並進行乘法運算

$ echo $(( 800*3/4 ))
600

您的其他範例也是“整數”。例如,如果你通過替換來強制 python 浮點44.0那麼你會得到不同的答案(Python 3 不需要這個)

$ python -c "print(800/(4.0/3))"
600.0

bc -l載入標準數學庫(具有s()正弦、l()自然對數等函式),但更重要的是,此處設置scale為 20。scale定義要在除法中生成小數後的小數位數,因此4/3會有1.33333333333333333333(實際上133333333333333333333/1e+20),並且這就解釋了為什麼你得到600.00000000000000000150.

echo 'scale=1000; 800/(4/3)' | bc

將使您獲得更高的精度(無需載入數學庫),但您永遠不會到達600那裡,因為4/3無法用十進製表示。

引用自:https://unix.stackexchange.com/questions/688790