如何在做 "longProperty1.divide(longProperty2)" 时不丢失小数位?
How to not lose decimal places when doing "longProperty1.divide(longProperty2)"?
我有两个LongProperty (there are no decimal places in a long) variables (longProperty1
and longProperty2
). I need to divide them and I need to keep the division result in a DoubleProperty(double中有小数位)变量(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
.
另一方面,result
将收到从 0.0
到 1.0
的值(例如:0.0
、0.2975
、0.5378
, 0.9853
, 1.0
), 因为在我的实际问题中 longProperty1 <= longProperty2
( 例如: 500/600=0.8333
, 1/2=0.5
, 1897/5975=0.3174
, . ..).
如何操作?
您应该使用 BigDecimal
进行计算。
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());
Bindings
是一个用于创建绑定的实用程序 class。在这里,我通过将 long
的除法转换为 double
,创建了一个 returns 和 double
的自定义绑定。你会在这里失去精度。
上面的输出是:
0.8490488685670847
0.6400068223798362
我有两个LongProperty (there are no decimal places in a long) variables (longProperty1
and longProperty2
). I need to divide them and I need to keep the division result in a DoubleProperty(double中有小数位)变量(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
.
另一方面,result
将收到从 0.0
到 1.0
的值(例如:0.0
、0.2975
、0.5378
, 0.9853
, 1.0
), 因为在我的实际问题中 longProperty1 <= longProperty2
( 例如: 500/600=0.8333
, 1/2=0.5
, 1897/5975=0.3174
, . ..).
如何操作?
您应该使用 BigDecimal
进行计算。
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());
Bindings
是一个用于创建绑定的实用程序 class。在这里,我通过将 long
的除法转换为 double
,创建了一个 returns 和 double
的自定义绑定。你会在这里失去精度。
上面的输出是:
0.8490488685670847
0.6400068223798362