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

How to convert numbers into boolean in Julia?

我想将数字转换为等效的布尔值。基于 official doc:

"false is numerically equal to 0 and true is numerically equal to 1."

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

[1] Bool(5)
> true

但是,朱莉娅给了我:

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

但是如果我说:

[1] Bool(0.0)

# result
> false

00.0 上看起来不错!但它不适用于 52.1 等数字

快速回答是,您似乎想要测试一个值是否为 non-zero,您可以像这样测试一个数字 x 是否为 non-zero:x != 0。然而,一个数字被认为是真还是假取决于你使用的是什么语言。更多内容见下文。

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

julia> false == 0
true

julia> true == 1.0
true

您可以看到无论数值类型是整数还是浮点数,还是更深奥的数字类型,如复数或有理数,均成立。我们还可以将布尔值转换为其他类型的数字:

julia> Int(false)
0

julia> Float64(true)
1.0

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

julia> Bool(0)
false

julia> Bool(1.0)
true

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

julia> Bool(5)
ERROR: InexactError: Bool(5)

这是因为 Bool 类型只能准确表示值零和一,尝试将任何其他数值转换为 Bool 将得到 InexactError。如果您尝试将不是 integer-valued 的浮点数转换为整数类型,则会出现同样的错误:

julia> Int(5.0)
5

julia> Int(5.5)
ERROR: InexactError: Int64(5.5)

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

julia> Int8(123)
123

julia> Int8(1234)
ERROR: InexactError: trunc(Int8, 1234)

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

许多语言用于数字真实性的约定是表示零的值是假的,而表示 no-zeros 的值是真值。请注意,这没有合理的数学原因:零不是假的, non-zero 数字不是真的;它只是来自 C 编程语言的约定,它没有布尔类型,并使用此约定在条件中将整数视为 true/false。然而,这个约定远非通用,因为有不遵循它的流行语言:例如,在 Lisps 和 Ruby 中,所有数字都是真实的。我最近在 Julia 话语论坛上写了一篇 post 关于不同语言中真实性的不同概念,以及为什么 Julia 拒绝真实性而是要求你写出一个明确的条件,比如数字与零进行比较,或者 non-emptiness collections.

由于您实际要检查的条件是一个数字是否等于零,这正是您应该做的:通过 x != 0 明确地将数字与零进行比较。这将计算为布尔值:如果 x 为 non-zero,则为 true;如果 x 等于零,则为 false。还有一个谓词函数也可以执行此操作:iszero(x) 检查 x 是否为零,如果您想这样做,这会很方便,例如计算 collection:

中有多少个零或 non-zero 值
julia> v = rand(-2:2, 100);

julia> count(iszero, v)
18

julia> count(!iszero, v)
82