在Java中,我试图找到一种方法将浮点数转换为分数字符串。例如:
float num = 1.33333;
String numStr = Convert(num); // Should return "1 1/3"
float num2 = 1.333;
String numStr2 = Convert(num2); // Should also return "1 1/3"
float num3 = 0.5;
String numStr3 = Convert(num3); // Should return "1/2"
float num4 = 2.25;
String numStr4 = Convert(num4); // Should return "2 1/4"
有关如何在Java中执行此操作的任何想法吗?
答案 0 :(得分:9)
最简单的方法可能是使用反复试验。
public static String toFraction(double d, int factor) {
StringBuilder sb = new StringBuilder();
if (d < 0) {
sb.append('-');
d = -d;
}
long l = (long) d;
if (l != 0) sb.append(l);
d -= l;
double error = Math.abs(d);
int bestDenominator = 1;
for(int i=2;i<=factor;i++) {
double error2 = Math.abs(d - (double) Math.round(d * i) / i);
if (error2 < error) {
error = error2;
bestDenominator = i;
}
}
if (bestDenominator > 1)
sb.append(' ').append(Math.round(d * bestDenominator)).append('/') .append(bestDenominator);
return sb.toString();
}
public static void main(String... args) {
System.out.println(toFraction(1.3333, 1000));
System.out.println(toFraction(1.1428, 1000));
for(int i=1;i<100000000;i*=10) {
System.out.println("PI "+i+": "+toFraction(3.1415926535897932385, i));
}
}
打印
1 1/3
1 1/7
PI 1: 3
PI 10: 3 1/7
PI 100: 3 14/99
PI 1000: 3 16/113
PI 10000: 3 16/113
PI 100000: 3 14093/99532
PI 1000000: 3 140914/995207
PI 10000000: 3 244252/1725033
答案 1 :(得分:1)
查看链分数。这允许您在给定精度内确定分母和分数。
对于Pi,您可以获得22/7或355/113,具体取决于您选择停止的时间。
答案 2 :(得分:0)
这可能会有所帮助:
http://www.merriampark.com/fractions.htm
否则你需要某种方式告诉Convert()你想要多远的东西。也许是一个最大程度减少的恶魔或类似的东西。这样你上面的前两个例子就得到“1 1/3”而不是第一个的“1 33333/100000”和第二个的“1 333/1000”。
答案 3 :(得分:0)
提取数字的小数部分(例如,((int) 0.5 + 1) - 0.5
,然后用结果(1 / 0.5
)除以1.你将获得分数的分母。然后将浮点数转换为int,你将获得整数部分。然后连接两者。
这只是一个简单的解决方案,只有当分数的分子为1时才会起作用。
double n = 1.2f;
int denominator = 1 / (Math.abs(n - (int) n - 0.0001)); //- 0.0001 so the division doesn't get affected by the float point aproximated representation
int units = (int) n;
int numerator = units * denominator + 1;
System.out.println("" + numerator + "/" + denominator); //6/5
System.out.println("" + units + " 1/" + denominator); //1 1/5
答案 4 :(得分:0)
假设您有“0.1234567”,然后计算小数点后面的数字(即7)。然后将数字乘以10 ^ 7,现在你有“1234567”。
将1234567除以10 ^ 7.然后,使用两个数字的GCD简化分数。
0.1234567 * 10000000 = 1234567
=> 1234567 / 10000000
=> System.out.println(1234567 / gcd(1234567,10000000) + "/" + 10000000/gcd(1234567,10000000));
答案 5 :(得分:0)
当已经识别出最佳分母时,修改FOR循环以打破循环。
if(error2 == 0)break;
public static String toFraction(double d, int factor) {
StringBuilder sb = new StringBuilder();
if (d < 0) {
sb.append('-');
d = -d;
}
long l = (long) d;
if (l != 0) sb.append(l);
d -= l;
double error = Math.abs(d);
int bestDenominator = 1;
for(int i=2;i<=factor;i++) {
double error2 = Math.abs(d - (double) Math.round(d * i) / i);
if (error2 < error) {
error = error2;
bestDenominator = i;
if (error2 == 0) break;
}
}
if (bestDenominator > 1)
sb.append(' ').append(Math.round(d * bestDenominator)).append('/') .append(bestDenominator);
return sb.toString();
}
public static void main(String... args) {
System.out.println(toFraction(1.3333, 1000));
System.out.println(toFraction(1.1428, 1000));
for(int i=1;i<100000000;i*=10) {
System.out.println("PI "+i+": "+toFraction(3.1415926535897932385, i));
}
}