快速回答是,您似乎想测试一个值是否非零,您可以测试一个数字 x 是否非零,如下所示: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
您不能做的是将不等于零或一的数字转换为布尔值:
julia> Bool(5)
ERROR: InexactError: Bool(5)
这是因为Bool 类型只能准确地表示值零和一,并且尝试将任何其他数值转换为Bool 将给出InexactError。如果您尝试将非整数值的浮点数转换为整数类型,则会遇到相同的错误:
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,则会出现错误。
许多语言用于数字真实性的约定是表示零的值是错误的,而表示非零的值是真实的。请注意,这没有合理的数学理由:零不是假的,非零数字不是真的;它只是来自 C 编程语言的约定,它没有布尔类型,并使用此约定在条件中将整数视为真/假。然而,这种约定远非普遍,因为有一些流行的语言不遵循它:例如,在 Lisps 和 Ruby 中,所有数字都是真实的。我最近在 Julia 讨论论坛上写了一个 post,关于不同语言中关于真实性的不同概念以及为什么 Julia 拒绝真实性,而是要求你写出一个明确的条件,比如数字与零的比较,或集合的非空性。
由于您实际要检查的条件是一个数字是否等于零,这正是您应该做的:通过执行x != 0 将数字与零显式比较。这将评估为一个布尔值:true 如果x 非零,false 如果x 等于零。有一个谓词函数也可以做到这一点:iszero(x) 检查x 是否为零,如果你想这样做会很方便,例如计算集合中有多少个零或非零值:
julia> v = rand(-2:2, 100);
julia> count(iszero, v)
18
julia> count(!iszero, v)
82