我想将数字转换为等效的布尔值。基于官方文档:
“假的数值等于 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!但它不适用于5或2.1等数字。
简单的答案是,您似乎想测试一个值是否非零,并且可以像x这样测试一个数字是否非零:x != 0。然而,一个数字被认为是真还是假取决于您使用的语言;下面有更多内容。
快速得到答案后,我们可以谈谈原因。文档说 和false在true数值上等于零和一。我们可以自己测试一下:
julia> false == 0\ntrue\n\njulia> true == 1.0\ntrue\nRun Code Online (Sandbox Code Playgroud)\n您可以看到,无论数字类型\xe2\x80\x94整数或浮点数,甚至更深奥的数字类型(如复数或有理数),等式都成立。我们还可以将布尔值转换为其他类型的数字:
\njulia> Int(false)\n0\n\njulia> Float64(true)\n1.0\nRun Code Online (Sandbox Code Playgroud)\n我们可以将这些值转换回布尔值:
\njulia> Bool(0)\nfalse\n\njulia> Bool(1.0)\ntrue\nRun Code Online (Sandbox Code Playgroud)\n你不能做的是将不等于 0 或 1 的数字转换为布尔值:
\njulia> Bool(5)\nERROR: InexactError: Bool(5)\nRun Code Online (Sandbox Code Playgroud)\n这是因为该Bool类型只能准确地表示值 0 和 1,并且尝试将任何其他数值转换为Bool都会给出InexactError. 如果您尝试将非整数值的浮点数转换为整数类型,这与您得到的错误相同:
julia> Int(5.0)\n5\n\njulia> Int(5.5)\nERROR: InexactError: Int64(5.5)\nRun Code Online (Sandbox Code Playgroud)\n或者一个较小类型的整数,其大小不足以表示该值:
\njulia> Int8(123)\n123\n\njulia> Int8(1234)\nERROR: InexactError: trunc(Int8, 1234)\nRun Code Online (Sandbox Code Playgroud)\n这里发生了完全相同的事情:Bool不够大,无法表示值 5,因此如果尝试将值 5 转换为 ,则会出现错误Bool。
许多语言用于数字真实性的约定是,表示零的值是假值,表示非零的值是真值。请注意,这没有合理的数学理由:零不是假的,非零数字不是真的;它只是来自 C 编程语言的约定,它没有布尔类型,并使用此约定在条件中将整数视为真/假。然而,这个约定远非通用,因为有些流行语言不遵循它:例如,在 Lisps 和 Ruby 中,所有数字都是真实的。我写了一篇文章,介绍了不同语言中真实性的不同概念,以及为什么 Julia 拒绝真实性,而是要求你写出一个明确的条件,例如数字与零比较,或集合非空。
\n由于您实际想要检查的条件是数字是否等于零,因此您应该这样做:通过执行 显式地将数字与零进行比较x != 0。这将计算为布尔值:trueifx非零且falseifx等于零。还有一个谓词函数也可以执行此操作:iszero(x)检查是否x为零,如果您想计算集合中有多少个零或非零值,这会很方便:
julia> v = rand(-2:2, 100);\n\njulia> count(iszero, v)\n18\n\njulia> count(!iszero, v)\n82\nRun Code Online (Sandbox Code Playgroud)\n