保留用于编程的计算单位

sov*_*ova 6 naming-conventions units-of-measurement

我想知道是否有任何甜言蜜语为"英尺"与"英寸"或"厘米"等提供某种抽象.我正在考虑在Java中做类似以下的事情:

u(56).feet() + u(26).inches()
Run Code Online (Sandbox Code Playgroud)

并能够得到类似的东西

结果为17.7292米.

一种可能的方法是,在创建新值时,立即将其转换为"基础"单位,如米或其他东西,以便您可以轻松添加它们.

但是,我宁愿有能力保存单位,所以就像这样

u(799.95555).feet() - u(76).feet() 
Run Code Online (Sandbox Code Playgroud)

回报

723.95555 feet
Run Code Online (Sandbox Code Playgroud)

并不是

243.826452 meters - 23.1648 meters = 220.661652 meters

//220.661652 meters to feet returns 723.955551 feet 
Run Code Online (Sandbox Code Playgroud)

既然这个问题看起来很普遍,那么是否存在任何框架甚至是一种优雅处理这种问题的编程语言?

我想我可以在我的方法中添加单位,将匹配单位+-*/添加到一起,只在需要时进行转换以便[加/减/乘/除],这对于加法和减法非常有用:

//A
{
    this.inches = 36.2;
    this.meters = 1;
}

//total length is 1.91948 m
Run Code Online (Sandbox Code Playgroud)

如果我用值添加到对象B

//B
{
    this.inches = 0.8;
    this.meters = 2;
}

//total length is 2.02032 m
Run Code Online (Sandbox Code Playgroud)

我得到一个新的对象

{
    this.inches = 37;
    this.meters = 3;
}

//total length is 3.9398 meters
Run Code Online (Sandbox Code Playgroud)

这真是太棒了,每当我想要没问题时我都可以转换它.但是乘法等操作会失败......

//A * B = 3.87796383 m^2
{
    this.inches = 28.96;
    this.meters = 2;
}

// ...but multiplying piece-wise and then adding
// gives you 2.01868383 m^2, assuming you make 2m*1m give you 2 m^2.
Run Code Online (Sandbox Code Playgroud)

所以我真的想用这个例子展示的是那个

( A1 + A2 ) * ( Z1 + Z2 ) is not ( A1 * Z1 ) + ( A2 * Z2 )
Run Code Online (Sandbox Code Playgroud)

而且我很确定这意味着如果他们想要乘法或除法,就必须转换为公共单位.

这个例子主要是为了阻止反身的答案,你在最后一刻转换之前逐个加或减它们,因为*并且/会失败.

tl; dr:在编程中是否有任何聪明的方法来保留单位?是否有巧妙的方法来命名方法/例程,以便我很容易理解我正在添加和减少的内容等?

Zec*_*ecc 5

我知道有这样一种语言,虽然我自己没有使用它.
它叫做Frink.

它不仅允许您为同一尺寸混合不同的单元,而且还可以在几种不同的物理测量上运行.其网站上的样本计算是一个有趣的阅读.我特别喜欢超人比特.