Java 如何在执行时不丢失小数位;longProperty1.分割(longProperty2)“;?

Java 如何在执行时不丢失小数位;longProperty1.分割(longProperty2)“;?,java,javafx,division,javafx-bindings,Java,Javafx,Division,Javafx Bindings,我有两个变量(longProperty1和longProperty2)。我需要对它们进行除法,并且我需要将除法结果保留在一个(双精度)变量中(result)而不丢失小数位 final DoubleProperty result = new SimpleDoubleProperty(0.0); final LongProperty longProperty1 = new SimpleLongProperty(45); final LongProperty longProperty2 = new S

我有两个变量(
longProperty1
longProperty2
)。我需要对它们进行除法,并且我需要将除法结果保留在一个(双精度)变量中(
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)
longProperty1
longProperty2
属于
LongProperty
类型,因为它们接收的数字非常大,所以我无法将它们转换为
DoubleProperties


另一方面,
结果将收到一个从
0.0
1.0
的值(例如:
0.0
0.2975
0.5378
0.9853
1.0
),因为在我真正的问题
longProperty1中,您应该使用
bigdecimic

LongProperty
只是普通long值的包装,因此没有小数点


您也可以尝试执行
longProperty1.divide(longProperty2.doubleValue())
,这将调用
DoubleBinding divide(final double other)
,但我认为这将消除使用
LongProperty
提供的
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());
是用于创建绑定的实用程序类。在这里,我创建了一个自定义绑定,通过将
long
s的除法转换为
double
来返回
double
。你会在这里失去精确性

上面的输出是:

0.8490488685670847
0.6400068223798362

doubleValue()
doc说:;施放会导致我丢失存储在LongProperty中的原始long值吗?@Douglas,
double
可以容纳非常大的数字,但会很快失去精度,因此绝对不建议使用它进行精确计算。所以,是的,它可能会使你失去原来的多头值。@Douglas你所说的大数字到底是什么意思?如果小于10000或100000,我认为您不会对
double
有任何问题。但是您不应该将其用于重要的计算,如货币。好的,我不需要在
结果
中使用高精度,但我需要在
longProperty1
longProperty2
的值更改时更新
结果
;使用
longProperty2.doubleValue()
I绑定一个常量值,这样
result
longProperty2
更改时不会更新。在
long
@EJP中没有小数位,我希望除法生成一个双精度,它有小数位。所以我把结果放在DoubleProperty中。@EJP我编辑了这个问题,你现在明白这个问题了吗?这完全符合我的需要,谢谢你回答和编辑我的问题。