gpt4 book ai didi

ios - NSDecimalNumber 返回错误的 uint64_t 值

转载 作者:行者123 更新时间:2023-12-03 17:19:34 25 4
gpt4 key购买 nike

我的应用程序通过 persistId 记住 MPMediaItems,就像人们所做的那样。它将 persistId 保存在 JSON 文件中,稍后读取并解析该文件。 NSJSONSerialization 创建一个 NSDecimalNumber 来包含 Id,我的应用程序稍后在 MPMediaQuery 中使用它来获取 MPMediaItem。

我发现有时会发现错误的 MPMediaItem。当我进一步研究时,我发现当我将 NSDecimalNumber 转换为 uint64_t 值时,[NSNumber unsignedLongLongValue] 返回错误的值!

NSDecimalNumber* const songId = _songId;
uint64_t const songIdValue = songId.unsignedLongLongValue;

songId is 1457249251113381177
songIdValue is 1457249251113381120
-or-
songId is 0x1439307919d12d39
songIdValue is 0x1439307919d12d00

到底是什么?看起来在将此 NSDecimalNumber 转换为 uint64_t 时低字节被清除。对于 NSDecimalNumber 来说,这是正确的行为吗?我是否发现了其中的错误?

我正在通过将 NSDecimalNumber 从 NSJSONSerialization 转换为字符串并使用 [NSString longLongValue] 将字符串转换为 uint64_t 来解决此问题。

可怕的是,我现在似乎必须去检查我在 JSON 文件中存储大整数的每个位置,并确保我以这种 NSString-y 方式评估它们。

最佳答案

如果您想保持最大精度,您可以:

仅使用 NSDecimalNumbers,

当您将 NSDecimalNumber 的值传输到另一个不是 NSDecimalNumber 的变量时,请使用 NSString。 [NSDecimalNumber longLongValue] 或 [NSDecimalNumber doubleValue] 等方法不够具体。

NSDecimalNumber     *songId;
uint64_t songIdValue;
NSString *intermediateStr;

songId = [NSDecimalNumber decimalNumberWithString:@"1457249251113381177"];
intermediateStr = songId.stringValue;
songIdValue = intermediateStr.longLongValue;

为什么使用字符串比其他方法更精确?我不知道。但songIdValue包含正确的值,没有任何损失。

关于ios - NSDecimalNumber 返回错误的 uint64_t 值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37537054/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com