You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让Unitful在乘除运算时自动转换为偏好单位?

让Unitful.jl自动将乘除结果转为偏好单位

我刚开始用Unitful.jl做代码中的量纲分析和单位转换,加减运算完全符合我的需求——我从事原子领域工作,通常希望数据以原子单位呈现,但有时数据会带有埃(Å)、纳米或皮米等单位,Unitful能自动完成转换,还能避免科研里的经典错误之一:

ijb@LAPTOP-GUG8KQ9I:~$ julia -O3
               _
   _       _ _(_)_     |  Documentation: https://docs.julialang.org
  (_)     | (_) (_)    |
   _ _   _| |_  __ _   |  Type "?" for help, "]?" for Pkg help.
  | | | | | | |/ _` |  |
  | | |_| | | | (_| |  |  Version 1.9.0 (2023-05-07)
 _/ |\__'_|_|_|\__'_|  |  Official https://julialang.org/ release
|__/                   |

julia> using Revise, OhMyREPL, Debugger, Test, Pkg, Unitful, UnitfulAtomic

julia> using Unitful.DefaultSymbols

julia> Unitful.preferunits(u"bohr")

julia> x=1.0u"bohr"
1.0 a₀

julia> y=1.0u"Å"
1.0 Å

julia> x+y
2.88972612462577 a₀

julia> x-y
-0.8897261246257702 a₀

julia> x+y*y
ERROR: DimensionError: 1.0 a₀ and 1.0 Å^2 are not dimensionally compatible.
Stacktrace:
 [1] +(x::Quantity{Float64, 𝐋, Unitful.FreeUnits{(a₀,), 𝐋, nothing}}, y::Quantity{Float64, 𝐋^2, Unitful.FreeUnits{(Å^2,), 𝐋^2, nothing}})
   @ Unitful ~/.julia/packages/Unitful/eFar5/src/quantities.jl:137
 [2] top-level scope
   @ REPL[39]:1

作为单位和量纲分析的爱好者,我觉得这功能非常好用……真希望我的主力编程语言Fortran也内置类似功能。

但乘除运算存在问题——Unitful本身没有错误,但返回结果的单位只是输入单位的乘积/商,而非对应量纲的偏好单位:

julia> x
1.0 a₀

julia> y
1.0 Å

julia> upreferred(dimension(x*y))
a₀^2

julia> x*y
1.0 Å a₀

除法的情况类似:

julia> x
1.0 a₀

julia> y
1.0 Å

julia> upreferred(dimension(x/y))


julia> x/y
1.0 a₀ Å^-1

目前我可以手动转换:

julia> x
1.0 a₀

julia> y
1.0 Å

julia> upreferred(dimension(x*y))
a₀^2

julia> auconvert(x*y)
1.8897261246257702 a₀^2

julia> uconvert(upreferred(dimension(x)*dimension(y)),x*y) # 更灵活的写法
1.8897261246257702 a₀^2

julia> uconvert(upreferred(dimension(x)/dimension(y)),x/y) # 除法也适用
0.529177210903

不过有没有办法让Unitful自动完成这个转换?我当然可以给用到的类型写对应的乘除方法,但难免会遗漏某些情况,反而又会遇到我想避免的经典错误;如果Unitful能自动处理就最好了。


内容的提问来源于stack exchange,提问作者Ian Bush

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.13 15:28:33