JSR 275 - 单位,每秒百分比

时间:2010-05-24 13:18:47

标签: java generics units-of-measurement jscience 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的问题(这就是我如何定义你自己的单位)。

3 个答案:

答案 0 :(得分:4)

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

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 measures 1/[T] (1/[T])

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

  

通常有不同的数量   不同的物理尺寸;   虽然它不是必需的也不是   必要的,例如扭矩和   能量具有相同的尺寸但具有相同的尺   不同性质(扭矩矢量,   标量为能量)。

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

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

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

答案 1 :(得分:3)

它有单位s^-1或Hz(JScience中的SI.HERTZ说话)。

Unit<Frequency>

答案 2 :(得分:0)

百分比不是一个单位,而是一个标量 - 所以每秒百分比只是每单位时间的标量值,这没有意义。这就像说“每秒3”。 3什么?

如果您将每单位时间测量的单位合并到一起,那将为您提供正确的单位。