相关疑难解决方法(0)

在Java中表示分数的最佳方式?

我正在尝试使用Java中的分数.

我想实现算术函数.为此,我首先要求一种方法来规范化功能.我知道我不能加1/6和1/2,直到我有一个共同点.我将不得不添加1/6和3/6.一个天真的方法会让我添加2/12和6/12,然后减少.如何实现性能损失最小的共同点?什么算法最适合这个?


版本8(感谢hstoerr):

改进包括:

  • equals()方法现在与compareTo()方法一致
final class Fraction extends Number {
    private int numerator;
    private int denominator;

    public Fraction(int numerator, int denominator) {
        if(denominator == 0) {
            throw new IllegalArgumentException("denominator is zero");
        }
        if(denominator < 0) {
            numerator *= -1;
            denominator *= -1;
        }
        this.numerator = numerator;
        this.denominator = denominator;
    }

    public Fraction(int numerator) {
        this.numerator = numerator;
        this.denominator = 1;
    }

    public int getNumerator() {
        return this.numerator;
    }

    public int getDenominator() {
        return this.denominator;
    } …
Run Code Online (Sandbox Code Playgroud)

java math fractions

95
推荐指数
7
解决办法
9万
查看次数

什么导致BigDecimal.divide的"非终止十进制扩展"异常?

我之前使用过BigDecimals但不经常使用BigDecimals,今天早上我正在处理一些事情并且我一直遇到以下异常:

Exception in thread "main" java.lang.ArithmeticException: Non-terminating decimal expansion;
no exact representable decimal result.
    at java.math.BigDecimal.divide(BigDecimal.java:1594)
Run Code Online (Sandbox Code Playgroud)

我试图设置比例并使用舍入来消除这样的问题:

    BigDecimal bd1 = new BigDecimal(1131).setScale(2,BigDecimal.ROUND_HALF_UP);
    BigDecimal bd2 = new BigDecimal(365).setScale(2,BigDecimal.ROUND_HALF_UP);
    BigDecimal bd3 = bd1.divide(bd2).setScale(2,BigDecimal.ROUND_HALF_UP);
    System.out.println("result: " + bd3);
Run Code Online (Sandbox Code Playgroud)

但是,我一直得到同样的例外.有谁能告诉我我犯了哪个错误?

java exception bigdecimal

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

为什么使用整数变量会抛出异常?

我遇到了以下两个代码.为什么它不会为浮点引发异常,而在其他情况下它会抛出运行时异常.

class FloatingPoint
    {
      public static void main(String [] args)
       {
         float a=1000f;
         float b=a/0;
        System.out.println("b=" +b);
       }
    }
Run Code Online (Sandbox Code Playgroud)

输出:b =无穷大.

如果我尝试使用int值,那么它将抛出运行时异常.为什么会这样?

java floating-point integer infinity

7
推荐指数
2
解决办法
489
查看次数

为什么Java中两个BigDecimal数字的划分会抛出ArithmeticException?

我们来看看Java中的以下代码片段.

package division;

import java.math.BigDecimal;

final public class Main
{
    public static void main(String[] args)
    {
        BigDecimal a = new BigDecimal(2);
        BigDecimal b = new BigDecimal(3);

        System.out.println(a.multiply(b));
        System.out.println(a.add(b));
        System.out.println(b.subtract(a));
        System.out.println(a.divide(b));
    }
}
Run Code Online (Sandbox Code Playgroud)

在上面的代码片段中,除最后一个(除法)之外的所有操作都成功执行.试图BigDecimal在Java中划分两个数字会引发争议java.lang.ArithmeticException.为什么?这个问题的解决方案是什么?

java

7
推荐指数
1
解决办法
8934
查看次数

划分BigDecimals会导致ArithmeticException

可能重复:
在BigDecimal.divide期间抛出ArithmeticException

这导致ArithmeticException:http://ideone.com/RXeZw

提供比例和舍入模式将给我错误的结果.此示例应输出50.03%.如何正确地圆?

为便于参考,这是代码:

BigDecimal priceDiff = BigDecimal.ONE
     .subtract(new BigDecimal(9.99)
     .divide(new BigDecimal(19.99)))
     .multiply(new BigDecimal(100));
System.out.println(priceDiff.toPlainString());
Run Code Online (Sandbox Code Playgroud)

java math

6
推荐指数
1
解决办法
8091
查看次数

如何始终以完整的十进制格式而不是科学记数法显示BigDecimal对象?

我有一个BigDecimal物体,myNumber长度未知.例如:12345678.

我一直想把这个数字除以100万,所以我这样做:

myNumber.divide(BigDecimal.valueOf(1000000))
Run Code Online (Sandbox Code Playgroud)

我明白了 12.345678.

我希望将其显示为字符串" 12.345678",而不会切断任何小数位.

所以我这样做

myNumber.divide(BigDecimal.valueOf(1000000)).toString()
Run Code Online (Sandbox Code Playgroud)

这适用于上面的例子.但是,如果myNumber是一个非常小或大的东西,例如:

0.00000001
Run Code Online (Sandbox Code Playgroud)

除以0.00000001一百万并转换为字符串后,它显示为科学记数法,这不是我想要的.我希望它始终以完整的十进制格式显示(在这种情况下0.00000000000001).

有任何想法吗?

java formatting bigdecimal

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