如何在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
创建字符串,然后将字符串连接在一起,插入“。” 两者之间。 然后将结果string
转换为double
。
如果你想采用纯粹的计算方法,而不是涉及在字符串和数字forms之间来回转换,那么你可以这样做:
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
类型,以避免溢出。 - 对于大于0的参数,
Math.signum()
返回1.0;对于小于零的参数,Math.signum()
返回-1.0。 这允许该方法优雅地处理integer
负值。 - 在将结果截断为整数之前,我将
Math.pow()
的结果加0.1,以防pow()
的结果pow()
不一定是精确的)略小于精确结果。
但请注意,问题本身似乎并不能解释(无限多的)无关紧要的前导零,这些前导零在概念上位于小数部分的有效数字之前。 也就是说,如果没有指示分数部分的比例的第三个参数,则无法获得123.00456
等的结果 。
如果b
的大小不是很简单,只需初始化一个新的包装器:
new Double(a + ((double)b / 1000))
请注意,我在这里显式地将b
为double
,以便获得b / 1000
的double
值而不是整数值。
如果整数的大小无关紧要,
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); } }