编程语言
首页 > 编程语言> > java – JSR 275 – 单位,每秒百分比

java – JSR 275 – 单位,每秒百分比

作者:互联网

我需要使用JScience.org的JSR 275单位和度量实现来表示每秒百分比的单位.我正在努力做到以下几点:

Unit<Dimensionless> PERCENT_PER_SECOND = NonSI.PERCENT.divide(Si.SECOND).asType(Dimensionless.class)

但是当我尝试这样做时,我得到了一个ClassCastException.

以下是有效的,但我不确定是否有更好的方法:

public interface PercentOverTime extends Quantity {}
public static Unit<PercentOverTime> PERCENT_PER_SECOND = new BaseUnit<PercentOverTime>("%/s");

有什么想法吗?我能找到的最接近的是Cooking Measurements上的问题(这就是我如何定义你自己的单位).

解决方法:

我写了这个代码示例来测试数学:

public void testUnit() {
    // define two points on a function from t -> %
    // the rate of change between these two points
    // should have unit %/t
    Measure<Double, Dimensionless> p0 = Measure.valueOf(50.0, NonSI.PERCENT);
    Measure<Double, Dimensionless> p1 = Measure.valueOf(20.0, NonSI.PERCENT);

    Measure<Double, Duration> timeDifference = Measure.valueOf(10.0, SI.SECOND);

    // JSR-275 has no Amount, so have to convert and do math ourselves
    // these doubles are percents
    double p0Raw = p0.doubleValue(NonSI.PERCENT);
    double p1Raw = p1.doubleValue(NonSI.PERCENT);

    // this duration is in seconds
    double timeDifferenceRaw = timeDifference.doubleValue(SI.SECOND);

    // this is the slope of the secant between the two points
    // so it should be the %/s we want
    double rateSecant = (p1Raw - p0Raw) / timeDifferenceRaw;

    // let's see what we get
    Measure<Double, ?> answer = Measure.valueOf(rateSecant,
                                                NonSI.PERCENT.divide(SI.SECOND));
    System.out.println(answer);
}

如果你的原始函数有时间作为自变量(例如秒)和比率作为自变量(例如百分比),那么这个函数关于时间的导数仍然会有时间作为自变量,但是将“每次比率”作为依赖.

是的,比率是无量纲的,所以这有点奇怪,但您可以想象一个股票价格中每日变化百分比的图表,然后是一天股票价格日变化百分比变化图表一天.

那打印出来的是什么?

-3.0 %/s

我们期望在10秒内将变化率从50%变为20%.

因此,您的单位构造应如下所示:

    Unit<?> magicUnit = NonSI.PERCENT.divide(SI.SECOND);
    Dimension magicDimension = Dimension.NONE.divide(Dimension.TIME);

    System.out.println(magicUnit + " measures " + magicDimension + " ("
            + magicUnit.getDimension() + ")");

实际上,正如我们所料,这打印%/ s测量1 / [T](1 / [T]).

所以我们有一个单位和维度,可以制作措施.我们测量的数量是多少?文档说这个数量:

Distinct quantities have usually
different physical dimensions;
although it is not required nor
necessary, for example Torque and
Energy have same dimension but are of
different nature (vector for torque,
scalar for energy).

因此,虽然频率似乎是正确的数量,但它并没有真正表达我们似乎正在讨论的语义量.

最后,您的第一行代码不起作用,因为在包含的模型中1 / [T]测量数量Freqency,而不是Dimensionless数量.因此,如果您不想制作自己的数量,请使用单位.您要查找的维度是无/时间,或者如果您想要正确的标量乘数,则为%/秒.最后,由您决定是否要制作自己的数量,但如果您在很多地方使用它,则可能是值得的.

查看JScience空间的最新发展也是值得的,因为他们似乎需要确定金额(加,减,乘,除,幂等方法).用Amount进行所有这些尺寸分析真的很容易.只需按百分比金额减去百分比金额并除以一秒金额就可以为你做单位.

标签:java,units-of-measurement,generics,jscience,jsr-275
来源: https://codeday.me/bug/20190526/1158849.html