相关疑难解决方法(0)

Java中的整数除法

这是一个基本问题,但我找不到答案.我已经研究了浮点运算和其他一些主题,但似乎没有任何东西可以解决这个问题.我确定我的术语错了.

基本上,我想要两个数量 - 完成和总数 - 并将它们分成一个百分比(已经完成了多少).数量是longs.这是设置:

long completed = 25000;
long total = 50000;

System.out.println(completed/total);  // Prints 0
Run Code Online (Sandbox Code Playgroud)

我已经尝试将结果重新分配给双 - 它打印0.0.我哪里错了?

顺便提一下,下一步是将这个结果乘以100,一旦这个小障碍被推翻,我认为应该很容易.

顺便说一句,这里没有作业,只是普通的老字号(今天可能编码过多).

java math floating-point println long-integer

87
推荐指数
3
解决办法
17万
查看次数

一般编程和 Java 中 double 的准确性

我知道由于浮点/双精度的性质,不应将它们用于精确的重要计算。但是,由于对类似问题的混合答案,我对它们的局限性感到有些困惑,无论有效数字如何,浮点数和双精度数是否总是不准确,或者仅不准确到第 16 位。

我在 Java 中运行了一些示例,

System.out.println(Double.parseDouble("999999.9999999999"); 
// this outputs correctly w/ 16 digits
System.out.println(Double.parseDouble("9.99999999999999");
// This also outputs correctly w/ 15 digits
System.out.println(Double.parseDouble("9.999999999999999");
// But this doesn't output correctly w/ 16 digits. Outputs 9.999999999999998
Run Code Online (Sandbox Code Playgroud)

我找不到指向另一个答案的链接,该链接指出 1.98 和 2.02 之类的值将四舍五入为 2.0,因此会造成不准确,但测试表明这些值打印正确。所以我的第一个问题是浮点/双精度值是否总是不准确,或者是否存在可以确保精度的下限。

我的第二个问题是关于使用 BigDecimal。我知道我应该使用 BigDecimal 进行精确的重要计算。因此,我应该使用 BigDecimal 的方法进行算术和比较。但是,BigDecimal 还包括一个doubleValue()将 BigDecimal 转换为双精度的方法。对我确定少于 16 位的双精度值进行比较是否安全?根本不会对它们进行算术运算,因此固有值不应该改变。

例如,我执行以下操作是否安全?

BigDecimal myDecimal = new BigDecimal("123.456");
BigDecimal myDecimal2 = new BigDecimal("234.567");
if (myDecimal.doubleValue() < myDecimal2.doubleValue()) System.out.println("myDecimal is smaller than myDecimal2");
Run Code Online (Sandbox Code Playgroud)

编辑:在阅读了对我自己的答案的一些回复后,我意识到我的理解不正确并已将其删除。以下是其中的一些片段,可能对未来有所帮助。

“双精度不能精确地容纳 0.1。最接近 0.1 …

java double

5
推荐指数
1
解决办法
4429
查看次数

标签 统计

java ×2

double ×1

floating-point ×1

long-integer ×1

math ×1

println ×1