Types 我不知道';我不理解如何在Julia中定义类型

Types 我不知道';我不理解如何在Julia中定义类型,types,julia,Types,Julia,我在学习朱莉娅,我只是对类型有点困惑。 我的问题很基本。我明白如果我写信 x = 64.0::MyType x应该包含值64,类型等于MyType。但是如果我写 x = 64.0::Float32 我得到了错误 ERROR: TypeError: in typeassert, expected Float32, got Float64 我发现下面的内容并没有给我一个错误 x = convert(Float32,64.0) 这是正确的方法吗?它似乎太复杂了。朱莉娅默认为Float64Flo

我在学习朱莉娅,我只是对类型有点困惑。 我的问题很基本。我明白如果我写信

x = 64.0::MyType
x应该包含值64,类型等于MyType。但是如果我写

x = 64.0::Float32
我得到了错误

ERROR: TypeError: in typeassert, expected Float32, got Float64
我发现下面的内容并没有给我一个错误

x = convert(Float32,64.0)

这是正确的方法吗?它似乎太复杂了。

朱莉娅默认为
Float64
Float32
文本需要
f
(与
e
相反):

正如雷诺补充的那样:


(因为我不认识Julia,所以我经常回答这个问题。但我知道如何搜索:)

问题是输入的
64.0
自动成为
Float64

julia> typeof(64.0)
Float64
因此,您希望直接构造一个
Float32
,如下所示:

julia> Float32(64.0)
64.0f0

julia> typeof(ans)
Float32

您写下的语法是,您定义了一个Float64,然后声明它应该是一个Float32,因此它正确地抛出了一个错误,表示它不兼容
64.0
64e0
是浮点64,而
64f0
是浮点32。因此,您只需要
x=64f0
。除了控制分派或定义结构的字段外,通常不需要此类类型断言。

来自@NilsGudat和@DaveNewton的答案都是正确的,但不完整,所以让我详细说明一下

需要注意的是,您的第一个示例,
x=64.0::MyType
,并不是如何创建许多类型
MyType
。当符号
a::MyType
出现在表达式的右侧时,它是一个类型断言。如果
a
MyType
的子类型(
a isa MyType
),它将返回
a
的值,但如果
a
不是
MyType
的子类型,它将抛出异常。在您的日常代码中,您不太可能经常需要它。有关类型声明和断言的更多信息,请参阅性能提示中的手册部分

正如@DaveNewton所指出的,Julia提供了一种用于创建
Float32
数字的语法。语法类似于
Float64
的科学表示法,例如
4.5e2
,除了
e
被替换为
f

julia> 4.5f2
450.0f0

julia> 450f0
450.0f0

julia> typeof(4.5f2)
Float32

请注意,将
::Float32
附加到
Float32
文本值不是必需的,实际上是多余的。因此,您不必按照@DaveNewton的建议编写
x=64.0f0::Float32
,只需编写
x=64.0f0

参考:谢谢。这似乎仍然太复杂,无法理解me@niandra82这有什么复杂之处?Julia有默认的文本,如果你不想要默认的,你需要显式地指定转换。我发现这不直观。但我可能需要更好地学习julia philosophydispatch和struct这正是我需要它的原因你没有定义dispatch或struct,所以不,这里不需要它。事实上,它所做的只是检查您案例中的类型和错误。这只是一个简单的示例来说明我不理解的地方。但在我的代码中,我想将其用于分派和结构;-)这不是“直接构造
Float32
”,而是将
Float64
转换为
Float32
。直接构造一个
Float32
将是
64.0f0
。我同意你的看法
julia> 4.5f2
450.0f0

julia> 450f0
450.0f0

julia> typeof(4.5f2)
Float32