- ubuntu12.04环境下使用kvm ioctl接口实现最简单的虚拟机
- Ubuntu 通过无线网络安装Ubuntu Server启动系统后连接无线网络的方法
- 在Ubuntu上搭建网桥的方法
- ubuntu 虚拟机上网方式及相关配置详解
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.
这篇CFSDN的博客文章详解iOS之关于double/float数据计算精度问题由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.
1、我们的app有一个判断,当用户输入的值,小于等于剩余的余额时,给用户弹窗,代码不往下执行 。
当用户输入 0.01 时,po 一下的结果是:0.10000.... ,当用户的余额是0.01时,po一下网络请求的返回结果是:0.009999... 。
当用户输入 66.05时,po 一下的结果是:66.049999...,当用户的余额是66.05时,po一下网络请求的返回结果是:66.049999... 。
所以,当数据较大时,不会有影响,因为用户输入的数据和网络返回数据都被变成了不精确的小值了;但是,当数据较小时,用户输入的数据没有被转,网络返回的数据被转成了不精确的小值,导致用户输入永远大于网络返回的数据,代码无法往下执行; 。
解决:使用 NSDecimalNumber 将float、double数据转化成NSDecimalNumber 类型的对象进行 +、-、*、/计算,再取值.
1
2
3
4
5
6
7
8
9
10
11
12
|
- (
double
)DecimalNumber:(
double
)num1 num2:(
double
)num2 {
NSDecimalNumber *n1 = [NSDecimalNumber decimalNumberWithString:[NSString stringWithFormat:@
"%f"
,num1]];
NSDecimalNumber *n2 = [NSDecimalNumber decimalNumberWithString:[NSString stringWithFormat:@
"%f"
,num2]];
NSDecimalNumber *n3 = [n1 decimalNumberBySubtracting:n2];
return
n3.doubleValue;
}
// 调用:
double
result = [self DecimalNumber: 2.01 num2: 2];
// 结果为 0.01
|
其中: decimalNumberBySubtracting: n1 - n2,返回 n1 - n2 的结果值 decimalNumberByMultiplyingBy:n1 * n2, decimalNumberByDividingBy:n1 / n2, decimalNumberByAdding:n1 + n2, compare:比较 n1 和 n2,返回比较结果; 。
2、进行数据的四舍五入获得结果 。
1
2
3
4
5
6
7
8
9
10
11
12
|
- (NSString*)Rounding:(
float
)number afterPoint:(NSInteger)position
{
NSDecimalNumberHandler *handler = [NSDecimalNumberHandler decimalNumberHandlerWithRoundingMode: NSRoundPlain scale: position raiseOnExactness: NO raiseOnOverflow: NO raiseOnUnderflow:NO raiseOnDivideByZero: NO];
NSDecimalNumber *floatDecimal = [[NSDecimalNumber alloc] initWithFloat: number];
NSDecimalNumber *resultNumber = [floatDecimal decimalNumberByRoundingAccordingToBehavior:handler];
return
[NSString stringWithFormat:@
"%@"
,resultNumber];
}
// 调用:
NSString *result = [self Rounding:8.00092 afterPoint:3];
// 结果为 8.001
|
其中,参数number是需要四舍五入的数据,position是小数点后保留的位数; 。
高精度要求 。
使用系统提供的NSDecimalNumber API进行计算,最后转换为字符串输出显示。NSDecimalNumber转换方法:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
|
#import "NSDecimalNumber+Y_Add.h"
@implementation NSDecimalNumber (Y_Add)
+ (NSDecimalNumber *)y_decimalNumberWithFloat:(
float
)value{
return
[self y_decimalNumberWithFloat:value scale:2];
}
+ (NSDecimalNumber *)y_decimalNumberWithFloat:(
float
)value scale:(
short
)scale{
return
[self y_decimalNumberWithFloat:value roundingMode:NSRoundBankers scale:scale];
}
+ (NSDecimalNumber *)y_decimalNumberWithFloat:(
float
)value roundingMode:(NSRoundingMode)roundingMode scale:(
short
)scale{
return
[[[NSDecimalNumber alloc] initWithFloat:value] y_decimalNumberHandlerWithRoundingMode:roundingMode scale:scale];
}
+ (NSDecimalNumber *)y_decimalNumberWithDouble:(
double
)value{
return
[self y_decimalNumberWithDouble:value scale:2];
}
+ (NSDecimalNumber *)y_decimalNumberWithDouble:(
double
)value scale:(
short
)scale{
return
[self y_decimalNumberWithDouble:value roundingMode:NSRoundBankers scale:scale];
}
+ (NSDecimalNumber *)y_decimalNumberWithDouble:(
double
)value roundingMode:(NSRoundingMode)roundingMode scale:(
short
)scale{
return
[[[NSDecimalNumber alloc] initWithFloat:value] y_decimalNumberHandlerWithRoundingMode:roundingMode scale:scale];
}
/**
* <#Description#>
*
* @return <#return value description#>
*/
- (NSDecimalNumber *)y_decimalNumberHandler{
return
[self y_decimalNumberHandlerWithRoundingMode:NSRoundBankers scale:2];
}
- (NSDecimalNumber *)y_decimalNumberHandlerWithRoundingMode:(NSRoundingMode)roundingMode scale:(
short
)scale{
NSDecimalNumberHandler *handler = [NSDecimalNumberHandler decimalNumberHandlerWithRoundingMode:roundingMode
scale:scale
raiseOnExactness:NO
raiseOnOverflow:YES
raiseOnUnderflow:YES
raiseOnDivideByZero:YES];
return
[self decimalNumberByRoundingAccordingToBehavior:handler];
}
@end
|
普通精度要求 。
使用系统提供的数学运算进行计算,最后转换为字符串输出显示。保留小数点后N位的方法:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
/**
* formatterNumber .00 小数点后两位
*
* @param number <#number description#>
*
* @return <#return value description#>
*/
+ (NSString *)y_formatterNumber:(NSNumber *)number{
return
[self y_formatterNumber:number fractionDigits:2];
}
+ (NSString *)y_formatterNumber:(NSNumber *)number fractionDigits:(NSUInteger)fractionDigits{
NSNumberFormatter *numberFormatter = [[NSNumberFormatter alloc] init];
[numberFormatter setMaximumFractionDigits:fractionDigits];
[numberFormatter setMinimumFractionDigits:fractionDigits];
return
[numberFormatter stringFromNumber:number];
}
|
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我.
原文链接:https://www.jianshu.com/p/65ad44cfd9d0 。
最后此篇关于详解iOS之关于double/float数据计算精度问题的文章就讲到这里了,如果你想了解更多关于详解iOS之关于double/float数据计算精度问题的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
下面的代码有效,我觉得double(double)和double(*)(double)没有区别,square和 &square,我说得对吗? #include double square(doubl
我知道我的作业很草率,这是我在这门课上的第 4 次作业。任何帮助将不胜感激,谢谢。 double getPrincipal(0); double getRate(0); double getYe
我遇到了那个错误,当我使用类时,我在使用函数指针时遇到了这个错误。我的函数'ope'函数我该如何解决 evaluator::function(){ double (*ope) (dou
问题://故事从哪里开始 Graphics 类型中的方法 drawLine(int, int, int, int) 不适用于参数 (double, double, double, double) g.
我有一张 map> m1 形式的 map .我可以将其复制到 map m2 形式的 map 吗?这样键是相同的,并且 m2 中的值是 get(m1->second) 不使用循环?谢谢! 最佳答案 这样
有没有办法获取vector> 的“.first”和“.second”的连续内存? ?我的意思是: void func(int N, double* x, double* y) { for (i
我正在尝试将自定义 lambda 传递给需要函数指针的函数(更准确地说是 zero 中的 Brent library 函数)。 我的想法是,我将使用参数创建一次 lambda,然后用多个值对其求值 x
这是一个很简单的问题,让我很困惑。 我收到一个源文件的以下错误,但另一个没有: 4 src/Source2.cpp:1466: error: no matching function for cal
struct CalculatorBrain { private var accumulator: Double? func changeSign(operand: Double) -
在我正在进行的项目中,我尝试使用 curlpp库来发出一个简单的 html GET 请求。当我将 cpp 文件传递给 g++ 时,出现以下错误: /usr/local/include/curlpp
不使用double就能获得quadruple精度超过16位的数字吗?如果可能的话,这取决于编译器还是其他?因为我知道有人说他使用double精度,并且具有22位精度。 最佳答案 数据类型double
我正在寻找有关特斯拉 GPU 中硬件如何实现 double 的信息。我读到,两个流处理器正在处理单个 double 值,但我没有找到 nvidia 的任何官方论文。 提前致谢。聚苯硫醚为什么大多数 G
这个问题在这里已经有了答案: Passing capturing lambda as function pointer (10 个答案) 关闭 2 年前。 我有这个错误 error: cannot
情况:我有一个元组列表,其中添加了一个元组: List> list = new List>(); list .Add(new Tuple(2.2, 6.6)); 一切似乎都还好。但是......在 D
我有一个 JList,里面有一堆名字,还有一个包含这些名字值的数组 final Double[] filmcost = { 5.00, 5.50, 7.00, 6.00, 5.00 }; 我想做的是,
我试图找出牛顿法来求方程的根。这个错误出来了,我无法处理。 double fn(double n){ return sin(n)+log(n)-1; } double f1n(double n
我有一个 junit 测试断言两个 Double 对象,具有以下内容: Assert.assertEquals(Double expected, Double result); 这很好,然后我决定将其
我正在尝试引入部分数据文件来填充数组,用户尝试了三次输入正确的数据文件名。我一再遇到这些错误。我知道像 arr 这样的数组只是一个指向内存块的指针。 #include #include #incl
我正在尝试完成复习题(为即将到来的编程决赛),但是,我无法解决这个问题,因为我不断收到错误(标题)。正如预期的那样,我将发布问题和我尝试的解决方案。 问题: 给定以下函数定义:void swap(do
任何人都知道如何实现这一目标。我已经尝试了通常的公式,但我只得到正数 Double.NEGATIVE_INFINITY) return d; } } 这将以相同的概率
我是一名优秀的程序员,十分优秀!