[英]User-facing numbers: implementing them efficient, “operational” and round-off safe?
[英]Explain “accumulated round-off error” for double values
我是Java的自學成才的初學者,在同一等式中使用時難以理解整數和雙精度
例如,
int x;
double x;
i = 5;
x = i / 2 + 1.0; // (answer 3.0)
z = (int) 1.0 + i / 2.0; // (answer 3.5)
四舍五入是什么?
問題是該操作:
i / 2
...正在執行整數除法。 這就是為什么5 / 2
給出的結果是2
,而不是2.5
。 這是Java中的正常行為,要執行浮點除法,必須確保至少一個操作數是浮點文字:
5 / 2.0
現在,上面的代碼將按預期返回2.5
。 或者,您可以強制轉換其中一個操作數:
((double) i) / 2
包含兩個整數的除法將得出一個整數(因此5/2 = 2)。 如果在其中一個操作數中使用double,則將產生double(因此5 / 2.0 = 2.5)。 其余的是操作優先級。
i / 2 = int 2
因為兩個操作數都是整數,所以使用整數除法運算(產生整數結果)
i / 2.0 = double 2.5
因為我首先被強制為double(另一個操作數的類型),並且使用了double除法
這是整數和十進制除法之間的情況。
當兩個整數相除時,將執行整數除法,即,將數字相除,並舍去小數部分。
當所討論的兩個數字中的任意一個數字為小數(雙精度/浮點數)時,其他所有數字都將被視為小數,從而使表達式為5 / 2.0。 無論對象2.0是哪種類型,結果都將返回2.5(默認情況下為double)。
給定混合方程式(例如5/2 + 1.0),運算符優先級定義了表達式的計算方式。 由於除法的優先級高於加法,因此5/2被評估為整數除法,返回2為整數。
然后將其添加到1.0,其中2在評估之前提升為雙精度,返回數字3.0作為最終結果的雙精度。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.