我正在尝试使用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) 我之前使用过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)
但是,我一直得到同样的例外.有谁能告诉我我犯了哪个错误?
我遇到了以下两个代码.为什么它不会为浮点引发异常,而在其他情况下它会抛出运行时异常.
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中的以下代码片段.
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.为什么?这个问题的解决方案是什么?
这导致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) 我有一个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).
有任何想法吗?