将“NSDecimalNumber”转换为“SInt64”而不会损失精度。 (SInt64、iOS 范围内)

发布于 2024-09-30 05:14:55 字数 410 浏览 7 评论 0原文

目前,使用字符串 @"9999999999999999" 创建的 [NSDecimalNumber longLongValue] 返回 10000000000000000

这意味着该类首先将其值转换为 double ,然后重新转换为 SInt64(signed long long)

如何避免这种行为?我想获得SInt64范围内的精确整数。

附言。 我考虑过使用 NSScannerstrtoll 转换为 NSString 并重新转换为 SInt64,但我相信有更好的选择方式。但如果你确定没有其他办法,请告诉我。

Currently, [NSDecimalNumber longLongValue] created with string @"9999999999999999" returns 10000000000000000.

This means the class converts it's value to double first, and re-converts into SInt64(signed long long)

How to evade this behavior? I want to get precise integral number within the range of SInt64.

PS.
I considered about converting to NSString and re-converting into SInt64 with NSScanner or strtoll, but I believe there's better way. But if you sure about there's no other way, please tell me that.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

泪冰清 2024-10-07 05:14:55

首先:除非您确定它对性能至关重要,否则我会将其写入字符串并扫描回来。这是最简单的方法。

现在,如果您确实想这样做:

  1. 从您的 NSDecimalNumber 获取一个 NSDecimal
  2. 使用结构的私有字段,初始化您的 long long 尾数的值(可能引入检查来处理太大的尾数)
  3. 乘以 10^指数;您可以使用二进制求幂来做到这一点;再次检查是否溢出

First: unless you're sure it's performance-critical, I'd write it into a string and scan it back. That's the easy way.

Now, if you really want to do it otherwise:

  1. get an NSDecimal from your NSDecimalNumber
  2. work with the private fields of the structure, initialize your long long value from the mantissa (possibly introduce checks to handle too-large mantissas)
  3. multiply by 10^exponent; you can do that using binary exponentiation; again, check for overflow
长亭外,古道边 2024-10-07 05:14:55

从 NSDecimalNumber*originalValue 开始。

令 int64_t approx = [originalValue longLongValue]。这并不准确,但非常接近。

将approx转换为NSDecimalNumber,计算originalValue -approx,取longLongValue,并添加到approx。现在你得到了正确的结果。

Start with an NSDecimalNumber* originalValue.

Let int64_t approx = [originalValue longLongValue]. This will not be exact, but quite close.

Convert approx to NSDecimalNumber, calculate originalValue - approx, take the longLongValue, and add to approx. Now you got the correct result.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文