6

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 m を出力します。明らかに何かが大きく間違っており、これは 3.05 m のはずです。これが実際にライブラリのバグであるとは信じがたいので、誰かが私に欠けているものを教えてくれることを願っています.

4

4 に答える 4

4

これを少し調べた後、問題の奇妙さを再現することができました。a を QuantityFactoryに渡すときにmultiply()またはメソッドを使用すると、奇妙な効果があるようです。例:divide()Unit

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()

于 2016-09-29T00:56:53.593 に答える
1

問題の再現方法について詳しく説明していただきありがとうございます。

NumberQuantityクラスは別の開発者 (電子メールで彼の問題を説明した) によって同様の問題を引き起こすと報告されました。したがって、私たちは改善すべき点を認識しており、修正が完了したら、RI のサービス リリースを発行します。

よろしく、 ヴェルナー

于 2016-09-30T11:57:34.093 に答える
1

JSR 363 RI のリリース1.0.1で修正されました。

于 2016-10-06T20:53:41.157 に答える