- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
这是一个简单的代码,显示了我认为处理双数时的错误...
double wtf = 36.76662445068359375000;
id xxx = [NSDecimalNumber numberWithDouble: wtf];
NSString *myBug = [xxx stringValue];
NSLog(@"%.20f", wtf);
NSLog(@"%@", myBug);
NSLog(@"-------\n");
终端将显示两个不同的数字
36.76662445068359375000和
36.76662445068359168
这是一个错误还是我遗漏了什么?
如果第二个数字被四舍五入,顺便说一句,这是一个非常奇怪的四舍五入......
= = = = = = = = =
我正在编辑原始问题以包含另一个 WTF 错误...
试试这个:
修改原来的数字,截断10位小数...所以...
double wtf = 36.76662445068359375000;
NSNumberFormatter *formatter = [[NSNumberFormatter alloc] init];
[formatter setMaximumFractionDigits:10];
NSString *valueX = [formatter stringFromNumber:[NSDecimalNumber numberWithDouble:wtf]];
[formatter release];
NSLog(@"%@", valueX);
现在的答案是36.7666244507
现在该值是一个具有 10 位十进制数字的字符串...现在让我们将其转换回 double
double myDoubleAgain = [valueX doubleValue];
NSLog(@"%.20f", myDoubleAgain);
答案是 36.76662445070000018177 ??????
myDoubleAgain 现在有更多位数!!!
最佳答案
通常情况下,我会进来并向人们解释他们输入的数字不能表示为 float ,以及舍入错误在哪里,等等等等。
这个问题比我们通常看到的有趣得多,它准确地说明了“浮点不精确,请阅读“每个计算机科学家都应该知道的内容”的大众智慧的错误所在...... '哈哈”。
36.76662445068359375
不仅仅是任何 19 位十进制数。它恰好是一个 19 位十进制数,也可以用 double 二进制 float 精确表示。因此,初始转换隐含在:
double wtf = 36.76662445068359375000;
是准确的。 wtf
恰好包含 b100100.11000100010000011
,并且未发生舍入。
NSDecimalNumber 的规范表示,它将数字表示为 38 位十进制尾数和 [-127,128] 范围内的十进制指数,因此 wtf
中的值也可以完全表示为 NSDecimalNumber。因此,我们可以得出结论:numberWithDouble
未提供正确的转换。尽管我找不到声称此转换例程已正确舍入的文档,但没有充分的理由不这样做。 这是一个真正的错误,please report it .
我注意到 iPhoneOS 上的字符串格式化程序似乎可以提供正确的舍入结果,因此您可以通过首先将 double 格式格式化为具有 38 位精度的字符串,然后使用 decimalNumberWithString
来解决此问题。并不理想,但它可能适合您。
关于iphone - cocoa - 我发现了 NSDecimalNumber 的一个错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2479100/
我有两个 NSDecimalNumbers,我需要将一个应用于另一个的幂,最初这段代码使用的是 double ,我可以使用 pow() 函数来计算它,如下所示: double result = pow
我知道这种问题不应该问。但是,我在没有任何线索的情况下在这里停留了几天。所以,我真的需要帮助。 我有一个核心数据对象,比如说产品。 //产品 NSDecimalNumber *数量 NSDecimal
我想将 NSDecimalNumber 转换为字节数组。另外,我不想为此使用任何库,例如 BigInt、BInt 等。 我试过这个: static func toByteArray(_ value:
我正在尝试使用以下代码将一些货币字符串(例如 $25,000)转换为 NSDecimalNumber: NSNumberFormatter *currencyFormatter = [[NSNumbe
我有一个用例,我想确定 swift 中的 NSDecimalNumber 是否有小数部分(0 除外)。我可以截断小数部分,但这涉及创建一个新的 NSDecimalNumber,如果可能的话,我想避免这
我有一个 iPad 应用程序,在 Beta 测试之前我正在 Instruments 中对其进行测试。除了一个内存泄漏,我已经摆脱了所有内存泄漏,而且我找不到任何关于它的信息。我不知道该怎么做,因为我的
这样做的最佳做法是什么: 我有一个 NSDecimalNumbers 数组,我需要将它们全部相加。 我打算设置一个基数,然后循环并将每个后续数字添加到基数......有点像这样: NSDecimal
111...1111 - 111...1110 应等于 1 NSLog(@"%@", [[NSDecimalNumber decimalNumberWithString:@"1111111111111
假设我有一个 NSDecimalNumber 类型的变量 v 让 v = 34.596904 采用自己的格式。 我想知道这个数字的精度和小数位数,而不是默认的。我在 NSDecimalNumber 类
在我的 iOS swift 应用程序中,我从网络上收到一些 json,其中包含一些代表货币的 double 值。它看起来像这样: [{"Amount": 5.0},{"Amount":-26.07},
我在读写 NSDecimalNumbers 时遇到了问题。假设我有这个十进制数: NSDecimalNumber *myNumber; // this is 123,23 然后我像这样读取它的值并将其
这是我的代码: - (void) addOrder { if(addStmt == nil) { const char *sql = "insert into item(men
我正在来回计算一些值,这就是我遇到问题的地方。假设您每年有 100 美元的金额,并使用十进制数字将它们作为月值保存到 CoreData: [self.sumPerMonth decimalNumber
我不太确定该怎么调用它,但我有一个文本字段来保存货币值,所以我将其存储为 NSDecimalNumber。我不想使用数字和符号键盘,所以我使用数字键盘,并像 ATM 一样推断小数位的位置。它适用于输入
假设我对这些 ivar 具有以下值: NSString* 百分比 = 35NSString* 值 = 146 在我下面的代码中,当我进行乘法 (146*.35) 时,我期望得到 51.1,但结果却是
我正在接收和解析 JSON 并将数据存储到核心数据中。一些数据是存储为 NSDecimalNumber 的货币,但其中一些值的精度高于两位小数。 例如,如果我从服务中获得一个值,如 8.2399999
在我的 ios 项目中,我使用了两个实体 (CoreData):具有一对多关系的 Person 和 Gifts 我知道如何计算给一个人的礼物总和: NSDecimalNumber *orderSum=
我有以下属性: @property (nonatomic, assign) NSDecimalNumber askingPrice; 我正在尝试从文本字段设置值: myManager.askingPr
有什么方法可以告诉 JSONDecoder 将传入的小数转换为字符串? public struct Transaction: Decodable { public let total: N
我想在除以 100 之后创建 NSDecimalNumber。我正在使用以下代码: NSDecimalNumber *amountToSendNumber = [number decimalNumbe
我是一名优秀的程序员,十分优秀!