如何在 Julia 中将数字转换为布尔值?

Sha*_*yan 5 boolean julia

我想将数字转换为等效的布尔值。基于官方文档

“假的数值等于 0,真的数值等于 1。”

所以我想将数值转换为等效的布尔值。预期行为示例

[1] Bool(5)
> true
Run Code Online (Sandbox Code Playgroud)

但是,朱莉娅给了我:

ERROR: InexactError: Bool(5)
Stacktrace:
 [1] Bool(x::Int64)
   @ Base .\float.jl:158
 [2] top-level scope
   @ REPL[26]:1
Run Code Online (Sandbox Code Playgroud)

但如果我说:

[1] Bool(0.0)

# result
> false
Run Code Online (Sandbox Code Playgroud)

0和看起来不错0.0!但它不适用于52.1等数字。

Ste*_*ski 7

简单的答案是,您似乎想测试一个值是否非零,并且可以像x这样测试一个数字是否非零:x != 0。然而,一个数字被认为是真还是假取决于您使用的语言;下面有更多内容。

\n

快速得到答案后,我们可以谈谈原因。文档说 和falsetrue数值上等于零和一。我们可以自己测试一下:

\n
julia> false == 0\ntrue\n\njulia> true == 1.0\ntrue\n
Run Code Online (Sandbox Code Playgroud)\n

您可以看到,无论数字类型\xe2\x80\x94整数或浮点数,甚至更深奥的数字类型(如复数或有理数),等式都成立。我们还可以将布尔值转换为其他类型的数字:

\n
julia> Int(false)\n0\n\njulia> Float64(true)\n1.0\n
Run Code Online (Sandbox Code Playgroud)\n

我们可以将这些值转换回布尔值:

\n
julia> Bool(0)\nfalse\n\njulia> Bool(1.0)\ntrue\n
Run Code Online (Sandbox Code Playgroud)\n

你不能做的是将不等于 0 或 1 的数字转换为布尔值:

\n
julia> Bool(5)\nERROR: InexactError: Bool(5)\n
Run Code Online (Sandbox Code Playgroud)\n

这是因为该Bool类型只能准确地表示值 0 和 1,并且尝试将任何其他数值转换为Bool都会给出InexactError. 如果您尝试将非整数值的浮点数转换为整数类型,这与您得到的错误相同:

\n
julia> Int(5.0)\n5\n\njulia> Int(5.5)\nERROR: InexactError: Int64(5.5)\n
Run Code Online (Sandbox Code Playgroud)\n

或者一个较小类型的整数,其大小不足以表示该值:

\n
julia> Int8(123)\n123\n\njulia> Int8(1234)\nERROR: InexactError: trunc(Int8, 1234)\n
Run Code Online (Sandbox Code Playgroud)\n

这里发生了完全相同的事情:Bool不够大,无法表示值 5,因此如果尝试将值 5 转换为 ,则会出现错误Bool

\n

许多语言用于数字真实性的约定是,表示零的值是假值,表示非零的值是真值。请注意,这没有合理的数学理由:零不是假的,非零数字不是真的;它只是来自 C 编程语言的约定,它没有布尔类型,并使用此约定在条件中将整数视为真/假。然而,这个约定远非通用,因为有些流行语言不遵循它:例如,在 Lisps 和 Ruby 中,所有数字都是真实的。我写了一篇文章,介绍了不同语言中真实性的不同概念,以及为什么 Julia 拒绝真实性,而是要求你写出一个明确的条件,例如数字与零比较,或集合非空。

\n

由于您实际想要检查的条件是数字是否等于零,因此您应该这样做:通过执行 显式地将数字与零进行比较x != 0。这将计算为布尔值:trueifx非零且falseifx等于零。还有一个谓词函数也可以执行此操作:iszero(x)检查是否x为零,如果您想计算集合中有多少个零或非零值,这会很方便:

\n
julia> v = rand(-2:2, 100);\n\njulia> count(iszero, v)\n18\n\njulia> count(!iszero, v)\n82\n
Run Code Online (Sandbox Code Playgroud)\n

  • 感谢您的这些精彩解释!我明白你关于这个概念的观点和我的错误!谢谢。 (5认同)
  • 非常不客气!很高兴您发现这个解释很有帮助。 (5认同)