gpt4 book ai didi

java - 浮点错误

转载 作者:行者123 更新时间:2023-12-01 13:24:33 27 4
gpt4 key购买 nike

我在处理浮点时遇到问题。一个双。例如,Java 中的 56 实际上可能存储为 .56000...1。

我正在尝试将小数转换为分数。我尝试使用连分数来做到这一点

Continuous Fractions

但是由于如何计算存储和四舍五入的小数,我使用该方法得到的答案不准确。

我尝试了另一种方法:

public static Rational rationalize(double a){
if(a>= 1){
//throw some exception
}
String copOut = Double.toString(a);

int counter = 0;
System.out.println(a);
while(a%1 != 0 && counter < copOut.length() - 2){
a *= 10;
counter++;
}
long deno = (long)Math.pow(10,counter);//sets the denominator
Rational frac = new Rational((long)a,deno)//the unsimplified rational number
long gcd = frac.gcd();
long fnum = frac.getNumer();//gets the numerator
long fden = frac.getDenom();//gets the denominator
frac = new Rational(fnum/gcd, fden/gcd);
return frac;
}

我使用字符串来查找小数的长度,以确定我应该乘以 10 的次数。稍后我会截断小数。这给了我正确的答案,但感觉不是正确的方法?有人可以建议“正确”的方法吗?

最佳答案

实际上你做得很好......但是如果输入是关于11.56的东西,这将会失败。这里你需要执行copOut.length() - 3

要使其动态使用String#split()

String decLength = copOut.split("\\.")[1]; //this will result "56" (Actual string after decimal)

现在你只需要做

while(a%1 != 0 && counter < decLength.length()){
a *= 10;
counter++;
}

如果你想删除循环,那么使用

long d = (long)Math.pow(10,decLength.length());
a=a*d;

关于java - 浮点错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21844665/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com