Java 度量单位库加法和减法返回不正确的值

标签 java jscience jsr363

我正在使用 JSR363 的引用实现。我已经尝试了很多变体,但我将以这段代码为例。

ServiceProvider provider = ServiceProvider.current();
QuantityFactory<Length> lengthFactory = provider.getQuantityFactory(Length.class);
Quantity<Length> first = lengthFactory.create(5, Units.METRE.divide(100.0));
Quantity<Length> second = lengthFactory.create(3, Units.METRE);
System.out.println(second.add(first));

这将打印 503.0 米。显然有些地方出了问题,这应该是 3.05 m。我发现很难相信这实际上是图书馆的一个错误,我希望有人能告诉我我遗漏了什么。

最佳答案

在仔细研究之后,我已经能够重现所讨论的奇怪之处。似乎在将 Unit 传递到 QuantityFactory 时使用 multiply()divide() 方法会产生奇怪的效果。例如:

Quantity firstQuant = quantFactory.create(10.0,Units.METRE)
Quantity secondQuant = quantFactory.create(20.0,Units.METRE.divide(10.0))
System.out.println(secondQuant.add(firstQuant))

输出以下内容:20.5 dm。即使使用 MetricPrefix(这似乎是设置非基本 SI 单位的默认方法),它似乎也会生成极其不准确的 Units。使用以下内容:

Quantity secondQuant = quantFactory.create(20.0,MetricPrefix.KILO(Units.METRE))

输出 10020.0 km 远不准确。但是,以下内容:

Quantity firstQuant = quantFactory.create(10.0,Units.METRE)
Quantity secondQuant = quantFactory.create(20.0,Units.METRE)
System.out.println(secondQuant.divide(10.0).add(firstQuant))

输出12.0 m,显然是正确答案。

老实说,最好的解决方案是在创建 Quantity 时简单地不使用这些操作,并使用内置的 getConverter() 转换为其他测量单位MetricPrefix 枚举。

创建 Quantities 的更好方法是使用 Quantities.getQuantities()

关于Java 度量单位库加法和减法返回不正确的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39717722/

相关文章:

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

java - 如何使用 JScience 创建涉及 vector 的符号变量/函数?

java - JSR 363 添加新单元

java - 如何解决lua错误: "attempt to index ? (a nil value)"

java - Mockito - stub 抽象父类方法

java - Jackson 模块签名阻止为自引用泛型类型添加序列化器

jsr363 - 使用 jsr 363 库在英里和公里之间进行单位转换

java - ReplaceAll 具有定义的替换编号 Java

java - Externalizable 与 Serializable 有何不同?