簡體   English   中英

目標c浮點增量錯誤值

[英]objective c float increment wrong value

我有一個關於循環中浮點值增量的查詢。

我有以下代碼

float add = 1.02f;
float counter = 0.0f;
for (int i = 0; i < 20; i++) {
    counter += add;
    NSLog(@"%f",counter);
}

執行此循環時,我得到以下結果

1.020000
2.040000
3.060000
4.080000
5.100000
6.120000
7.140000
8.160000
9.180000
10.200001
11.220001
12.240002
13.260002
14.280003
15.300003
16.320004
17.340004
18.360004
19.380005
20.400005

這是預期的結果

1.020000
2.040000
3.060000
4.080000
5.100000
6.120000
7.140000
8.160000
9.180000
10.200000
11.220000
12.240000
13.260000
14.280000
15.300000
16.320000
17.340000
18.360000
19.380000
20.400000

為什么我在不添加循環的情況下得到一些浮點數。

我需要循環超過1000次。 我想要float變量中的值。

提前致謝。

發生這種情況是因為float無法精確表示您擁有的值。 有兩種簡單的解決方法:

  • 表示作為目標值100次,使用整數數目 - 1.02變為1022.04變為204 ,依此類推。
  • 使用NSDecimalNumber代表您的數字 -與float不同, NSDecimalNumber可以完全精確地代表您的所有值。

這是實現第一種方法的方法:

int add = 102;
int counter = 0;
for (int i = 0; i < 20; i++) {
    counter += add;
    NSLog(@"%d.%d", counter/100, counter%100);
}

這是實現第二種方法的方法:

NSDecimalNumber add = [NSDecimalNumber decimalNumberWithString:@"1.02"];
NSDecimalNumber counter = [NSDecimalNumber zero];
for (int i = 0; i < 20; i++) {
    counter = [counter decimalNumberByAdding:add];
    NSLog(@"%@", counter);
}

為什么我在不添加循環的情況下得到一些浮點數。

因為float是二進制類型,不能完全代表十進制值。 除了讓您嘗試完全而正確地進行解釋之外,讓我為您指出著名的論文《每位計算機科學家應該知道的有關浮點算法的知識》

計算機中的浮點數表示形式是近似值,並不精確。 有時,您最終嘗試顯示無法在計算機的浮點數實現中准確表示的數字,因此它為您提供了近似值。 此外,由於重復的浮點數乘法,加法運算等操作,您還會得到較小的算術誤差。 最好的辦法是使用double ,它比float的精度更高。 在特殊情況下,您也可以用不同的格式表示數據,並僅更改向用戶顯示數據的方式以適合他們的期望。 例如,當使用美元和美分時,您可以將總計存儲為許多美分(只能是整數),然后將其格式化為正確顯示給用戶的美元和美分。 那時沒有浮點取整問題發生。

浮點數使用四個字節= 32位。

  • 1位符號
  • 8位指數
  • 尾數23位

精度:小數位數的精度是通過number_of_mantissa_bits * Log10(2)計算的 因此,單精度和雙精度分別為〜7.2和〜15.9。

這就是為什么您開始在第7位看到舍入錯誤的原因

源鏈接

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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