如何在 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
在 0
和 0.0
上看起来不错!但它不适用于 5
或 2.1
等数字
快速回答是,您似乎想要测试一个值是否为 non-zero,您可以像这样测试一个数字 x
是否为 non-zero:x != 0
。然而,一个数字被认为是真还是假取决于你使用的是什么语言。更多内容见下文。
快速得到答案后,我们可以谈谈原因了。文档说 false
和 true
在数值上等于零和一。我们可以自己测试一下:
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
我想将数字转换为等效的布尔值。基于 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
在 0
和 0.0
上看起来不错!但它不适用于 5
或 2.1
等数字
快速回答是,您似乎想要测试一个值是否为 non-zero,您可以像这样测试一个数字 x
是否为 non-zero:x != 0
。然而,一个数字被认为是真还是假取决于你使用的是什么语言。更多内容见下文。
快速得到答案后,我们可以谈谈原因了。文档说 false
和 true
在数值上等于零和一。我们可以自己测试一下:
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:
julia> v = rand(-2:2, 100);
julia> count(iszero, v)
18
julia> count(!iszero, v)
82