【问题标题】:How to not lose decimal places when doing "longProperty1.divide(longProperty2)"?执行“longProperty1.divide(longProperty2)”时如何不丢失小数位?
【发布时间】:2018-02-26 04:40:59
【问题描述】:

我有两个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)

longProperty1longProperty2LongProperty 类型,因为它们接收的数字非常大,所以我不能将它们转换为 DoubleProperties

另一方面,result 将接收从 0.01.0 的值(例如:0.00.29750.53780.98531.0),因为在我真正的问题longProperty1 <= longProperty2(例如:500/600=0.83331/2=0.51897/5975=0.3174,...)。

如何做到这一点?

【问题讨论】:

  • long 中没有小数位。
  • @EJP 我希望除法产生一个双精度数,它有小数位。所以我将结果放在 DoubleProperty 中。
  • @EJP 我编辑了问题,你现在明白问题了吗?

标签: java javafx division javafx-bindings


【解决方案1】:

LongProperty(以及其他NumberExpressions)提供的方法,例如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 是一个用于创建绑定的实用程序类。在这里,我创建了一个自定义绑定,它通过将longs 的除法转换为double 来返回double。你会在这里失去精确度。

上面的输出是:

0.8490488685670847
0.6400068223798362

【讨论】:

  • 这完全符合我的需要,感谢您回答和编辑我的问题。
【解决方案2】:

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

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

【讨论】:

  • doubleValue() 文档说:"Returns the value of this ObservableNumberValue as a double. If the value is not a double, a standard cast is performed."; cast 会导致我丢失存储在 LongProperty 中的原始 long 值吗?
  • @Douglas, double 可以容纳非常大的数字,但是您会很快失去精度,因此绝对不建议将其用于精确计算。所以是的,它可能会导致你失去原来的 long 值。
  • @Douglas 你所说的大数字是什么意思?如果它小于 10_000 或 100_000,我认为您不会对 double 有任何问题。但您不应该将其用于货币等重要计算。
  • 好的,我不需要result 的高精度,但我需要在longProperty1longProperty2 的值更改时更新result;使用longProperty2.doubleValue()我绑定了一个常量值,这样resultlongProperty2改变时不会更新。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-15
  • 2023-02-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-09-14
相关资源
最近更新 更多