做" longProperty1.divide(longProperty2)&#34 ;?时如何不丢小数位?

时间:2017-09-17 15:34:42

标签: java javafx division javafx-bindings

我有两个LongProperty (长篇中没有小数位)变量(longProperty1longProperty2)。我需要划分它们,我需要将除法结果保持在DoubleProperty (双精度数中有小数位)变量(result而不会丢失小数地方

final DoubleProperty result = new SimpleDoubleProperty(0.0);
final LongProperty longProperty1 = new SimpleLongProperty(45);
final LongProperty longProperty2 = new SimpleLongProperty(7);
result.bind(longProperty1.divide(longProperty2));
System.out.println(result.get()); //print: "6.0" instead of "6.428571428571429" (lost decimal places)

longProperty1longProperty2属于LongProperty类型,因为它们会收到非常大的数字,因此我无法将它们转换为DoubleProperties

另一方面,result会收到0.01.0的值(例如:0.00.2975,{{1} },0.53780.9853),因为在我真正的问题中1.0(例如:longProperty1 <= longProperty2500/600=0.83331/2=0.5,... )。

怎么做?

2 个答案:

答案 0 :(得分:1)

LongProperty(以及其他NumberExpression)提供的方法(例如divide)是便捷方法。您可以创建一个可以执行任何操作的自定义绑定:

final DoubleProperty result = new SimpleDoubleProperty(0.0);
final LongProperty longProperty1 = new SimpleLongProperty(812323534);
final LongProperty longProperty2 = new SimpleLongProperty(956745323);
result.bind(Bindings.createDoubleBinding(() -> longProperty1.longValue() / (double) longProperty2.longValue(),
    longProperty1, longProperty2));
System.out.println(result.get());
longProperty1.set(612323534);
System.out.println(result.get());

Bindings是用于创建绑定的实用程序类。在这里,我创建了一个自定义绑定,通过将double s的除法转换为long来返回double。你在这里会失去精确度。

以上的输出是:

0.8490488685670847
0.6400068223798362

答案 1 :(得分:0)

您应该使用BigDecimal进行计算 LongProperty只是通常长值的包装器,因此没有小数点。

您也可以尝试longProperty1.divide(longProperty2.doubleValue()),这会调用DoubleBinding divide(final double other),但我认为这会消除使用LongProperty的重点。