簡體   English   中英

目標 C 問題與舍入浮點數

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM