在 Objective C 中,将浮点数乘以 100 有时会产生一个稍微出乎意料的结果

Posted

技术标签:

【中文标题】在 Objective C 中,将浮点数乘以 100 有时会产生一个稍微出乎意料的结果【英文标题】:Multiplying float with 100 sometimes gives a slightly unexpected result in Objective C 【发布时间】:2020-12-10 08:57:38 【问题描述】:

所以我试图将 UISlider 的值转换为整数,这样我就可以将它用作索引以从 NSArray 中获取值,但将滑块值相乘有时会产生意想不到的结果..

int index = self.moveHistoryLabelSlider.value * 100;

前几个结果很好,但当它达到 0.15 时,它开始给出不同的结果。这是slider.value和slider.value*100的NSLog:

slider value = 0.150000 slider * 100 = 14.999999

它也发生在其他浮点数中,例如 0.19 * 100 给出 19.999998。我该如何解决这个问题?

【问题讨论】:

见***.com/questions/2667130/how-to-round-cgfloat你需要四舍五入 【参考方案1】:

这个问题是Floating Point Numbers (https://floating-point-gui.de/basic/) 的本质。您可以使用两种简单的方法来最小化舍入误差:

    以所需的精度计算整数而不是浮点数:
// Float calculation
float value = 0.15; // 0.150000006
float multiplier = 100; // 100
NSLog(@"%f", value * multiplier); // 15.000001

// Convert float to integers and back
int precision = 100;
int intValue = value * precision; // 15
float result = (intValue * (int)multiplier) / (float)precision;
NSLog(@"%f", result); // 15.000000

    使用NSDecimalNumber进行计算
NSDecimalNumber* decimalValue = [[NSDecimalNumber alloc] initWithDecimal:@(value).decimalValue]; // 15 x 10^-2
NSDecimalNumber* decimalMultiplier = [[NSDecimalNumber alloc] initWithDecimal: @(multiplier).decimalValue]; // 10 x 10^2
NSDecimalNumber* decimalResult = [decimalValue decimalNumberByMultiplyingBy:decimalMultiplier];
NSLog(@"%f", decimalResult.floatValue); // 15.000000

【讨论】:

以上是关于在 Objective C 中,将浮点数乘以 100 有时会产生一个稍微出乎意料的结果的主要内容,如果未能解决你的问题,请参考以下文章

为啥将浮点数除以整数返回 0.0?

在 C 中,如何将浮点数或双精度数除以 2 的 i 次幂?

如何将浮点数转换为长度为 4 的字节数组(char* 数组)?

如何使用 C 中的常量格式化将浮点数转换为指数

如何将浮点数从 C# 应用程序发送到 C++ 应用程序?

C将浮点数转换为int