【问题标题】:How to convert numbers into boolean in Julia?如何在 Julia 中将数字转换为布尔值?
【发布时间】:2022-11-10 22:47:21
【问题描述】:

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

“false 在数值上等于 0,true 在数值上等于 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 等数字。

【问题讨论】:

    标签: boolean julia


    【解决方案1】:

    快速回答是,您似乎想测试一个值是否非零,您可以测试一个数字 x 是否非零,如下所示: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
    

    您不能做的是将不等于零或一的数字转换为布尔值:

    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
    

    【讨论】:

    • 感谢您提供这些精彩的解释!我明白你关于这个概念和我的错误的观点!谢谢。
    • 不客气!很高兴您发现解释很有帮助。
    猜你喜欢
    • 2016-10-18
    • 2018-12-20
    • 2019-04-12
    • 2014-11-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-13
    • 1970-01-01
    相关资源
    最近更新 更多