如何在JAVA中将两个int合并为一个double



如果我有:

int a = 123;
int b = 456;

如何获取?:

double c = 123.456;

这个怎么样:

int a = 123; int b = 456;
double c = Double.parseDouble(a + "." + b);

数学解

int a = 123; 
int b = 456;
double c = a + (b == 0 ? 0 : b / Math.pow(10, 1 + (int) Math.log10(b)));

解释:

1 + (int) Math.log10(b)     // number of digits (3 in case of 123)
Math.pow(10, 1 + ... )      // 10...0 - 1 with required number of zeroes

从每个integer中创建字符串,然后将字符串连接在一起,在两者之间插入一个"."。然后将得到的CCD_ 2转换为CCD_。

如果你想采用纯计算方法,而不是在字符串和数字形式之间来回转换,那么你可以这样做:

double concatToDouble(int integer, int fraction) {
if (fraction < 0) {
throw new NumberFormatException("The fractional part must not be negative");
} else if (fraction == 0) {
return integer;
} else {
int numFractionDigits = (int) Math.log10(fraction) + 1;
int scaleFactor = (int) (Math.pow(10, numFractionDigits) + 0.1);
return (double) ((long) integer * scaleFactor
+ (long) Math.signum(integer) * fraction)
/ scaleFactor;
}
}

它的表达时间稍长,但它的性能会更好,因为它所涉及的工作比转换到字符串格式和从字符串格式转换所涉及的工作量要少得多。

计算注释:

  • 向上缩放整数部分,执行整数加法,然后将向下缩放总和,将获得与所需double最接近的结果,但是
  • 在许多情况下,double对于要形成的十进制数没有精确的表示
  • 我仔细而有意地选择了类型。特别是,在计算缩放值之前,我将integer的值转换为类型long,以避免溢出
  • Math.signum()对大于0的参数返回1.0,对小于零的参数返回-1.0。这允许该方法优雅地处理integer的负值
  • 我在Math.pow()的结果上加0.1,然后将结果截断为整数,以防pow()的结果(不一定精确)略小于精确结果

但是,请注意,问题本身似乎并没有解释(无限多)在分数部分的有效数字之前的不重要的前导零。也就是说,如果没有指示分数部分的比例的第三个参数,就无法获得123.0456123.00456的结果。。

如果b的大小不是可选的,只需初始化一个新的包装器:

new Double(a + ((double)b / 1000))

注意,我在这里显式地将b强制转换为double,以便获得b / 1000double值,而不是整数值。

如果int的大小无关紧要,

public class TestStackOverflowQuestion {
public static void main(String[] args) {
int a = 123;
int b = 456;
double c = a + Double.parseDouble("." + b);
System.out.println(c);
}
}

最新更新