objective-c - 在 Objective C 中,将浮点数乘以 100 有时会产生一个稍微出乎意料的结果
问题描述
所以我试图将 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。我该如何解决?
解决方案
这个问题是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
推荐阅读
- r - 从 bash 调用 R 脚本时退出代码
- c++ - 赋值运算符并不总是在模板类上调用
- javascript - JS 函数适用于单个数组,但在尝试遍历数组数组时行为不端
- python - 使用 Tensor 编写 Numpy 操作
- javascript - 如果填充了表单,则在 React 中构造 POST Json
- typescript - 将 React Redux 连接到 Typescript 中的组件
- php - 如何使所有 example.com 页面重定向到 example.com/smth
- python - 如何从 Julia 的 if 语句中打破 for 循环?
- python - nan到空字符串python
- javascript - 从本地主机跨站点cookie到paystack?