为什么 NSString floatvalue 为 “NaN” 返回 0?

Why NSString floatvalue return 0 for "NaN"?

提问人:Udo 提问时间:5/5/2023 最后编辑:Udo 更新时间:5/5/2023 访问量:47

问:

为什么我没有得到 NaN?0 是错误的。也许是编译器设置?

CGFloat fValue = [@"NaN" floatValue]; // fValue is 0
double ddd = [@"NaN" doubleValue]; // also 0`

编辑:奇怪,在 swift 中,这有效并返回 nan:

let fValue = Float ("NaN")
let ddd = Double ("NaN")
objective-c nsstring cgfloat

评论

0赞 Cy-4AH 5/5/2023
你可以写:double ddd = NAN;
0赞 Cy-4AH 5/5/2023
你可以写:double ddd = atof("NaN");
2赞 HangarRash 5/6/2023
请注意,Objective-C 和 Swift 之间的比较是在比较完全不同的情况。在 Swift 中,和结构体正在处理字符串的转换。Objective-C 代码要求类提供基元数值。这些基本上是相反的方法。更好的比较是,如果在 Objective-C 中有一个接受或者,如果在 Swift 中,有一个 or 属性(虽然没有)。所以这里根本没有一个公平的比较。FloatDoubleNSStringNSNumberNSStringStringfloatValuedoubleValue

答:

1赞 son 5/5/2023 #1

它写在文档上。这是针对浮点值的,与双精度值相同。

https://developer.apple.com/documentation/foundation/nsstring/1412321-floatvalue

此属性在字符串的开头不包含空格。此属性在溢出时为 HUGE_VAL 或 –HUGE_VAL,在下溢时为 0.0。如果字符串不以浮点数的有效文本表示形式开头,则此属性为 0.0。

评论

0赞 Udo 5/5/2023
NaN 的有效文本表示形式是什么?Swift 知道这一点,C# 也知道这一点。
0赞 son 5/5/2023
如果您将“NaN”转换为 Float,它是有效的,因为 Float 符合 LosslessStringConvertible 协议,该协议允许您将 “inf” 转换为无穷大或将 “NaN” 转换为 nan。查看 Swift.Math.Floating Foundation。
0赞 Udo 5/5/2023
好的,我知道在转换为浮点之前,我必须检查字符串中的“NaN”。
0赞 son 5/5/2023
如果你想在 Objective-c 上创建一个“nan”,就像 double nan = NAN 一样简单。有一个宏来表示它。
-2赞 Hao Liang 5/5/2023 #2

float 的字符串 “NaN” 为 0。
0是对的,你是错的。

评论

0赞 Udo 5/5/2023
为什么?在 swift 中,“NaN”是 nan,在 C# 中,“NaN”也是双精度。南