所以我想做的是将double转换为有理数。我检查小数点后有多少个数字,例如,我想将数字123.456保存为123456/1000。
public Rational(double d){
String s = String.valueOf(d);
int digitsDec = s.length() - 1 - s.indexOf('.');
for(int i = 0; i < digitsDec; i++){
d *= 10;
}
System.out.println((int)d); //checking purposes
}
但是,对于数字123.456,我得到了一个四舍五入的错误,结果是123455。我想可以用BigDecimal来解决这个问题,但我无法使其正常工作。同样,在计算出有理数之后,我想用参数(int
numerator,int denominator)调用另一个构造函数,但显然不能在println现在所在的行中调用该构造函数。我应该怎么做?
对于问题的第一部分,Java将.6存储为.5999999(重复)。看到以下输出:
(after first multiply): d=1234.56
(after second multiply): d=12345.599999999999
(after third multiply): d=123455.99999999999
一种解决方法是在循环结束后立即使用d = Math.round(d)。
public class Rational {
private int num, denom;
public Rational(double d) {
String s = String.valueOf(d);
int digitsDec = s.length() - 1 - s.indexOf('.');
int denom = 1;
for(int i = 0; i < digitsDec; i++){
d *= 10;
denom *= 10;
}
int num = (int) Math.round(d);
this.num = num; this.denom = denom;
}
public Rational(int num, int denom) {
this.num = num; this.denom = denom;
}
public String toString() {
return String.valueOf(num) + "/" + String.valueOf(denom);
}
public static void main(String[] args) {
System.out.println(new Rational(123.456));
}
}
它有效-试试吧。
对于您问题的第二部分…
为了从第一个调用第二个构造函数,可以使用“ this”关键字
this(num, denom)
但这必须是构造函数中的第一行…在这里没有意义(我们必须先进行一些计算)。因此,我不会尝试这样做。
问题内容: 所以我将double设置为1234,我想将小数点后移至12.34 因此,我将.1乘以1234两次,就像这样 这将打印结果 有没有一种方法,不用简单地将其格式化为两位小数,就可以正确地保存双重存储12.34? 问题答案: 如果使用或,则应使用舍入或期望看到一些舍入错误。如果你无法执行此操作,请使用。 你遇到的问题是0.1不是精确的表示形式,并且通过执行两次计算,你正在使该错误复杂化。 但
问题内容: 显然已弃用。 考虑到JUnit的广泛使用,令人惊讶地缺少JUnit的javadocs。你能告诉我如何使用新的吗? 问题答案: Epsilon是您的“模糊因素”,因为双精度可能并不完全相等。Epsilon让您描述它们之间必须有多近。 如果您期望的是3.14159,但需要花费3.14059至3.14259(即0.001以内),那么您应该编写类似 (顺便说一句,22/7达到3.1428+,将
问题内容: 上面的代码显示: 我如何才能仅打印(或将其用作)11.4? 问题答案: 正如其他人提到的那样,如果您想要精确表示为11.4,则可能要使用该类。 现在,对造成这种情况的原因进行一些解释: Java中的和类型是浮点数,其中的数字以小数和指数的二进制表示形式存储。 更具体地说,双精度浮点值(例如doubletype)是64位值,其中: 1位表示符号(正或负)。 指数为11位。 52位为有效数
问题内容: 有人知道我如何将双精度值四舍五入为3个有效数字,例如本网站上的示例 http://www.purplemath.com/modules/rounding2.htm 问题答案:
问题内容: 我正在使用Windows 7计算机,其“控制面板\时钟,语言和区域”为“丹麦” 根据扫描仪的文档: 扫描程序的初始语言环境是Locale.getDefault()方法返回的值。 但是当我运行代码时: 它输出“ en_US”,然后在sc.nextDouble()处引发java.util.InputMismatchException。当扫描仪初始化为“ 1,0”时,它可以工作 但是,如果我
我有值,我希望它们至少有两个十进制数字,但我不想修剪其余的数字。 是否有构建方法或更优雅的方法来实现这一点? 我不能使用,因为我希望在存在其他小数时保留它们。