我想把数字转换成等价的布尔值。基于官方医生
"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
它在0
和0.0
上看起来不错!但它不适用于5
或2.1
等数字。
发布于 2022-05-27 14:16:01
快速的答案似乎是,您想要测试一个值是否为非零,并且您可以测试一个数字x
是否为非零,比如:x != 0
。然而,一个数字被认为是真还是假,取决于你使用的是哪种语言;下面将更详细地介绍。
得到了快速的答案之后,我们可以谈谈为什么。文档说,false
和true
在数字上等于0和1。我们可以自己检验一下:
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
类型只能精确地表示0和1的值,并且试图将任何其他数值转换为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中,所有的数字都是真实的。我最近在朱莉娅话语论坛上写了一篇关于不同语言中关于真实性的不同概念的帖子文章,为什么朱莉娅拒绝真实,而是要求你写出一个明确的条件,比如数字的比较和数字的零,或者集合的非空性。
由于实际要检查的条件是一个数字是否等于零,所以应该这样做:通过执行x != 0
显式地将数字与零进行比较。这将计算为一个布尔值:如果true
为非零,则为false
,如果x
为零。还有一个谓词函数也可以做到这一点:iszero(x)
检查x
是否为零,如果您想要计算集合中有多少个零值或非零值,这是很方便的:
julia> v = rand(-2:2, 100);
julia> count(iszero, v)
18
julia> count(!iszero, v)
82
https://stackoverflow.com/questions/72406426
复制相似问题