如何在Java中保存小数

12

以下是Java代码:

double operation = 890 / 1440;  
System.out.println(operation);  

结果: 0.0

我想要的是保留这个操作的前四位小数 (0.6180)。你知道怎么做吗?


2
你想把它“保存”在哪里? - Bozho
浮点数(float或double)的运算结果不精确,这使它们不适用于需要精确结果而非近似值的任何财务计算。请使用BigDecimal代替。 - Andrey Dmitriev
7个回答

19

使用一个求值为double而不是int的表达式来初始化你的变量:

double operation = 890.0 / 1440.0;
否则,表达式将使用整数算术进行计算(结果将被截断)。 然后,这个被截断的结果被转换为一个double

虽然这看起来很漂亮,但最好将两个数字都显式转换为双精度浮点数。原因是如果有人(即使是 OP 以后)稍后更改数字,他们可能会忘记添加小数点,从而导致功能神秘地崩溃。 - Cam
我同意,Bozho的123d解决方案更为优选,因为意图更清晰。 - Steve Kuo
其中之一的陷阱。我个人喜欢在这种情况下留下一点评论。例如:“必须使用双精度字面量,整数字面量将导致整数运算。”这总是一个小提醒,为什么会这样。 - f470071

13
你可以使用双精度字面量 d - 否则你的数字会被认为是int 类型:

你可以使用双精度字面量 d - 否则你的数字会被认为是int 类型:

double operation = 890d / 1440d;

那么你可以使用NumberFormat来指定数字的位数。

例如:

NumberFormat format = new DecimalFormat("#.####");
System.out.println(format.format(operation));

NumberFormat能让我在变量中保存四个小数位,还是只显示前“X”个小数位? - Eric
2
NumberFormat仅影响表示方式,变量“operation”不受影响。 - Kennet

7

你也可以这样做:

double result = (double) 890 / 1400;

以下代码将会输出:

0.6180555555555556

您可以在这里查看如何将数字四舍五入。


1
只需记住,你并没有将(890/1440)转换为double。你是将890转换为double。而(double/int)操作返回一个double。 - corsiKa
是的。但我认为这种方法稍微好一点,因为它也适用于双变量而不仅仅是硬编码的变量,至少在我的C#编程经验中,我曾遇到同样的问题,并按照上述方法修复了它。 - npinti

6
使用BigDecimal完成此操作。
   import java.math.BigDecimal;
import java.math.RoundingMode;


    public class DecimalTest {

        /**
         * @param args
         */
        public static void main(String[] args) {
            double operation = 890.0 / 1440.0;
            BigDecimal big = new BigDecimal(operation);     
            big = big.setScale(4, RoundingMode.HALF_UP);        
            double d2 = big.doubleValue();
            System.out.println(String.format("operation : %s", operation));
            System.out.println(String.format("scaled : %s", d2));
        }
    }

输出

操作:0.6180555555555556 缩放:0.6181


2

虽然使用起来很笨拙,但 BigDecimal 提供了一些格式化选项:

    BigDecimal first = new BigDecimal(890);
    BigDecimal second = new BigDecimal(1440);
    System.out.println(first.divide(second, new MathContext(4, RoundingMode.HALF_EVEN)));

1
double operation = 890.0 / 1440;
System.out.printf(".4f\n", operation);

0

如果你真的想要将小数点后第一位四舍五入,你也可以使用整数算术,首先通过将第一个数字乘以适当的数量来将其位数向右移动:

long fractionalPart = 10000L * 890L / 1440L;

我在这里使用long类型,以避免临时结果不适合32位而导致溢出。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接