[英]Objective C Issue With Rounding Float
我有一個將計算結果四舍五入到小數點后兩位的問題。
這是一個財務計算,當結果涉及半美分時,我希望這個數字會被四舍五入,但實際上它正在被四舍五入。
要復制問題:
float raw = 16.695;
NSLog(@"All DP: %f",raw);
NSLog(@"2 DP: %.2f",raw);
回報:
All DP: 16.695000
2 DP: 16.69
而我希望看到:
All DP: 16.695000
2 DP: 16.70
任何人都可以建議這是設計使然還是(很可能)我遺漏了某些東西,以及我是否可以采取任何措施來解決它。 在這種情況下,它是至關重要的。
在此先感謝,奧利
float
進行財務計算! 浮點數無法准確表示某些值。 16.695
就是其中之一。 當您嘗試將該值存儲在浮點數中時,您實際上獲得了最接近的可表示值。 當你對浮點數執行一系列操作時,你可能會失去精度,然后你就會失去准確性。 這會導致賠錢。
使用實際的貨幣類型,使用NSDecimalNumber ,或者使用int
進行所有計算,計算您關心的最小單位(即, 1050
是 10.50 美元的整美分,或者 1.050 美元,如果你想要幾分之一便士)。
據我所知, NSLog()
function 只需要格式化 arguments 並且不嘗試舍入。
您可能習慣於使用支持舍入的printf()
樣式 function。
我建議使用math.h
中的眾多函數之一在 output 之前對您的值進行四舍五入,並且僅依靠NSLog()
進行格式化。
看到評論后
使用 C 標准 function 系列圓形()。 roundf()用於浮點,round()用於雙精度, roundl()用於長雙精度。 然后,您可以將結果轉換為您選擇的 integer 類型
你可以試試這個:
- (void)testNSlogMethod {
float value = 16.695; //--16.70
value = value *100;
int mulitpler = round(value);
NSLog(@"%.2f",mulitpler/100.0f);
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.