如何比较十进制值

Posted

技术标签:

【中文标题】如何比较十进制值【英文标题】:How to compare decimal values 【发布时间】:2013-11-19 07:26:51 【问题描述】:

我在比较两个十进制值时遇到问题。 我有一个文本字段,其中包含 0.123456 之类的数字和包含 0.000001 的 NSNumber。 两者的最大小数位数为 6。最小值 - 0 我试过这样做:

NSNumberFormatter *decimalFormatter = [[NSNumberFormatter alloc] init];
[decimalFormatter setNumberStyle: NSNumberFormatterDecimalStyle];
[decimalFormatter setMaximumFractionDigits:6];

double sum = [[decimalFormatter numberFromString:self.summTextField.text] doubleValue];

if (self.minSum != nil) 
    if (sum < [self.minSum doubleValue]) 
        return NO;
    

但我有一个问题,有时 0.123456 = 0,123455999... 或 0,123456000000...01 例如 @0.000001 doubleValue

我如何与 NSNumber 与小数部分进行比较,以确保它是正确的?

提前致谢。

【问题讨论】:

【参考方案1】:

为四舍五入创建小数扩展

extension Decimal 
 func rounded(toDecimalPlace digit: Int = 2) -> Decimal 
    var initialDecimal = self
    var roundedDecimal = Decimal()
    NSDecimalRound(&roundedDecimal, &initialDecimal, digit, .plain)
    return roundedDecimal
  


let value1 = Decimal(2.34999999).rounded(toDecimalPlace: 4)
let value2 = Decimal(2.34999989).rounded(toDecimalPlace: 4)
print(value1.isEqual(to: value2))

这导致TRUE

【讨论】:

【参考方案2】:

如果您担心小数部分,您可以四舍五入您的值... 像这样的:

-(double)RoundNormal:(double) value :(int) digit

    value = round(value * pow(10, digit));
    return value / pow(10, digit);

然后比较一下。

【讨论】:

【参考方案3】:

如果你不想太麻烦,你可以简单地进行测试

if(abs(x-y) < 0.0001)

【讨论】:

【参考方案4】:

这应该解决它:

NSNumberFormatter *decimalFormatter = [[NSNumberFormatter alloc] init];
[decimalFormatter setNumberStyle: NSNumberFormatterDecimalStyle];
[decimalFormatter setMaximumFractionDigits:6];
[decimalFormatter setMinimumFractionDigits:6];
[formatter setRoundingMode:NSNumberFormatterRoundHalfUp];
[formatter setRoundingIncrement:[NSNumber numberWithDouble:0.000001]]

【讨论】:

setMinimumFractionDigits:6。但是可能有 1 或 3,或 0。这段代码可以吗?【参考方案5】:

使用 NSDecimalNumber 类 - 请参阅指南数字和值编程主题

【讨论】:

【参考方案6】:

这是 NSDecimal 数字在 ios 中的比较方式:

if ( [x compare:y] == NSOrderedSame )
    // If x is equal to y then your code here..


if([x compare:y] == NSOrderedDescending)
    // If x is descendant to y then your code here..


if([x compare:y] == NSOrderedAscending)
    // If x is ascendant to y then your code here.. 

【讨论】:

以上是关于如何比较十进制值的主要内容,如果未能解决你的问题,请参考以下文章

如何比较熊猫数据框列中可用的十进制数?

如何编写CompareTo方法以比较二进制搜索算法中的字符串值

如何读取 UTF-16 文件并将其内容与使用十六进制值定义的 wchar_t* 字符串文字进行比较

reg查询返回十六进制值

C#如何把16进制字符串转成值相等的byte数组?

CF745 D 交互题 思维 二进制分解