[英]Float values dividing error in Objective C
當我運行這段代碼時:
float angle = startAngle;
int i = 0;
for (float f = self.minNumber; f <= self.maxNumber; f += minorTickIncrement) {
points[i++] = CGPointMake(centerX + cos(angle) * (radius - tickInset), centerY + sin(angle) * (radius - tickInset));
CGFloat myTickLength;
NSLog(@"f : %f",f);
NSLog(@"tickIncrement : %f",tickIncrement);
NSLog(@"f / tickIncrement : %f",f / tickIncrement);
NSLog(@"(int)(f / tickIncrement) : %d",(int)(f / tickIncrement));
NSLog(@"(f / tickIncrement - (int)(f / tickIncrement)) : %f",(f / tickIncrement - (int)(f / tickIncrement)));
NSLog(@"fabs((f / tickIncrement - (int)(f / tickIncrement))) : %f",fabs((f / tickIncrement - (int)(f / tickIncrement))));
float checkValue = (f / tickIncrement - (int)(f / tickIncrement));
if (fabs(checkValue) < 0.05) { // if is major tick
myTickLength = self.tickLength;
NSString *string = [[NSString alloc] initWithFormat:@"%0.1f", f];
float textWidth = textHeight * [string length] / 2;
CGContextShowTextAtPoint(ctx, centerX + cos(angle) * (radius - textInset) - textWidth / 2.0, centerY + sin(angle) * (radius - textInset) + textHeight / 4.0, [string UTF8String], [string length]);
[string release];
} else {
myTickLength = self.minorTickLength;
}
points[i++] = CGPointMake(centerX + cos(angle) * (radius - myTickLength - tickInset), centerY + sin(angle) * (radius - myTickLength - tickInset));
angle += minorTickAngleIncrement;
}
顯示以下輸出:
f : 0.100000
tickIncrement : 0.100000
f / tickIncrement : 1.000000
(int)(f / tickIncrement) : 1
(f / tickIncrement - (int)(f / tickIncrement)) : 0.000000
fabs((f / tickIncrement - (int)(f / tickIncrement))) : 0.000000
f : 0.120000
tickIncrement : 0.100000
f / tickIncrement : 1.200000
(int)(f / tickIncrement) : 1
(f / tickIncrement - (int)(f / tickIncrement)) : 0.200000
fabs((f / tickIncrement - (int)(f / tickIncrement))) : 0.200000
f : 0.140000
tickIncrement : 0.100000
f / tickIncrement : 1.400000
(int)(f / tickIncrement) : 1
(f / tickIncrement - (int)(f / tickIncrement)) : 0.400000
fabs((f / tickIncrement - (int)(f / tickIncrement))) : 0.400000
f : 0.160000
tickIncrement : 0.100000
f / tickIncrement : 1.600000
(int)(f / tickIncrement) : 1
(f / tickIncrement - (int)(f / tickIncrement)) : 0.600000
fabs((f / tickIncrement - (int)(f / tickIncrement))) : 0.600000
f : 0.180000
tickIncrement : 0.100000
f / tickIncrement : 1.800000
(int)(f / tickIncrement) : 1
(f / tickIncrement - (int)(f / tickIncrement)) : 0.800000
fabs((f / tickIncrement - (int)(f / tickIncrement))) : 0.800000
f : 0.200000
tickIncrement : 0.100000
f / tickIncrement : 2.000000
**(int)(f / tickIncrement) : 1**
(f / tickIncrement - (int)(f / tickIncrement)) : 1.000000
fabs((f / tickIncrement - (int)(f / tickIncrement))) : 1.000000
...................
在哪里,您可以看到在輸出(int)(f / tickIncrement) : 1
的最后一個塊中(int)(f / tickIncrement) : 1
必須返回2,但返回1。
為什么會這樣?
最有可能的是,您遇到了浮點表示法問題。
嘗試使用double,但是知道它不會解決根本的問題,您看到的2.0
實際上是1.99999 ...
只是被格式化為顯示2.0
閱讀“ 每位計算機科學家應了解的浮點運算法則 ”
在此期間,請嘗試簡單地使用:
(int)(f / tickIncrement + tickIncrement / 5.0)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.