2017-09-08 33 views
4

我想明白爲什麼升壓::格式提供了比圓形

double nbr = 102262.5; 

boost::format("%.0f") % nbr; 

102262round(102262.5)102263.0

如果我們再看另一個例子價值34087.5

boost::format("%.0f") % nbr 

給出不同的結果34088round(34087.5)給出相同的34088

這是否意味着圓實現了一個更復雜的算法,以確保最接近的while格式或printf不?

+0

你用'round(nbr)'得到了什麼?不同的是不一樣的。 –

+0

當使用文字值時,我得到與round(nbr)相同的結果。 – Bing

+0

你是指'std :: round'還是'boost :: round'?無論如何,他們都使用相同的四捨五入,這使得更令人驚訝的是'boost :: format'的工作方式不同 – user463035818

回答

7

有一件事叫做「半到半」或「半至奇」(link)。

這是一個規則,以減少舍入誤差的偏見和 boost::format似乎實施這樣的戰略。 本質上,這是以決定性的方式(取決於數字本身)同時上下旋轉打破平局的情況(例如1.5或2.5)。如果一個人總是將這些情況整理或舍入,則可以通過四捨五入來引入統計偏差。 後者是似乎由round執行的更「經典」的四捨五入方式。

請注意,由boost::format(半到偶數)執行的策略對應於IEEE 754標準中的默認舍入模式。

+0

非常感謝,如此有效,它們的工作方式不一樣。而boost :: format的算法更復雜。 – Bing

+0

不同。不同的舍入策略適用於不同的域/應用程序。如果沒有記錄,假設任何特定的四捨五入都是不好的,很少有理由期望不同的庫使用相同的。 – sehe