我想四舍五入浮點數的最后 3 位數字169786.122,只留下 3 位數字
是否可以使用 math.h 庫和 ceil 函式來做到這一點?
在169786.122==的情況下170
在169121.122==的情況下169
在171126.122==的情況下171
在179911.122==的情況下180
.. 等等
float aNum = 169726.122;
int main() {
printf("%.0f\n",aNum); // result 169726
return 0;
}
uj5u.com熱心網友回復:
如果:
- 通過選擇 1000 的偶數倍數來打破平局是令人滿意的,
- 所需的 1000 的倍數可以用
float格式表示,并且 float格式使用以二或十為基數,
然后(x - remainderf(x, 1000)) / 1000計算所需的結果。
這是有效的,因為該remainderf函式總是產生一個精確的結果(沒有舍入誤差),如果可以表示所需的 1000 倍數,那么減法會產生沒有舍入誤差的倍數。如果浮點格式使用以 10 為底,則除法只是改變指數并且沒有舍入誤差。如果格式使用以二為底的格式,則 125 的倍數除以 125 乘以 2 的冪不能增加有效位數,因此結果必須適合有效位數,因此不存在舍入誤差。
這些警告并不嚴格。我希望可以進行各種改進。特別是,如果nearbyint((x - remainderf(x, 1000)) / 1000)使用 IEEE-754 “單精度”格式 (binary32),它會在所有可表示所需結果的情況下獲得正確的結果。
uj5u.com熱心網友回復:
#include <math.h> <-- 包含 math.h 以使用 round 函式
將最后 3 位四舍五入(使用@Steve Summit 評論作為答案)
將 aNum 除以 1000,呼叫 round。(丟棄3位數字)
float aNum = 169726.122;
int main() {
printf("%.0f\n", round(aNum / 1000)); // result 170
return 0;
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/424822.html
上一篇:吐出錯誤數字的斐波那契數列
