如何将int转换成double
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何将int转换成double相关的知识,希望对你有一定的参考价值。
以C语言为例,步骤如下:
1、新建一个vc项目。
2、添加头文件。
3、添加main主函数。
4、定义int类型变量sum,count。
5、定义double类型变量todouble,并进行强制类型转换。
6、使用printf打印结果。
7、编译运行程序。
参考技术A将int转换成double可以使用强制类型转换、自动类型转换两种方式。
1、强制类型转换
强制类型转换是通过类型转换运算来实现的。其一般形式为:(类型说明符)(表达式)其功能是把表达式的运算结果强制转换成类型说明符所表示的类型。自动转换是在源类型和目标类型兼容以及目标类型广于源类型时发生一个类型到另一类的转换。
例如: (double) a 把a转换为双精度浮点型,(int)(x+y) 把x+y的结果转换为整型。
2、自动类型转换
(1)执行算术运算时,低类型(短字节)可以转换为高类型(长字节);例如: int型转换成double型,char型转换成int型等。
(2)赋值表达式中,等号右边表达式的值的类型自动隐式地转换为左边变量的类型,并赋值给它。
(3)函数调用时,将实参的值传递给形参,系统首先会自动隐式地把实参的值的类型转换为形参的类型,然后再赋值给形参。
(4)函数有返回值时,系统首先会自动隐式地将返回表达式的值的类型转换为函数的返回类型,然后再赋值给调用函数返回。
扩展资料:
C语言常用数据类型:
1、int:整数类型
2、float:单精度浮点类型
3、double:双精度浮点类型
4、char:字符类型
5、char *:字符指针类型
参考资料来源:百度百科-强制类型转换
参考技术B直接把int赋值给double就可了。
举例:
int a = 12;
double b = a;
System.out.println(b );
备注:如果想算出两个int数的除法值,必须先把数据转换成double类型,否则计算结果不准确。
代码含义:把数值12赋值给a,由于由低到高可以直接转化的关系,帮可以直接把a赋值给doube型,所以直接赋值即可
参考技术C 直接把int赋值给double就可了。举例:
int a = 12;
double b = a;
System.out.println(b );
备注:如果想算出两个int数的除法值,必须先把数据转换成double类型,否则计算结果不准确。
代码含义:把数值12赋值给a,由于由低到高可以直接转化的关系,帮可以直接把a赋值给doube型,所以直接赋值即可本回答被提问者采纳 参考技术D 直接转换怎么会不成功呢?
int a=5;
System.out.println(double(a));
输出是5.0
还有一种转换技巧
int a=5;
System.out.println(a+0.0);
这样a加上一个double型的,也会转换为double.
将 double 转换为 int 数组
【中文标题】将 double 转换为 int 数组【英文标题】:Convert double to int array 【发布时间】:2019-02-19 01:14:46 【问题描述】:我有双份
double pi = 3.1415;
我想把它转换成一个 int 数组
int[] piArray = 3,1,4,1,5;
我想出了这个
double pi = 3.1415;
String piString = Double.toString(pi).replace(".", "");
int[] piArray = new int[piString.length()];
for (int i = 0; i <= piString.length()-1; i++)
piArray[i] = piString.charAt(i) - '0';
它有效,但我不喜欢这种解决方案,因为我认为数据类型之间的大量转换会导致错误。我的代码是否完整,还是需要检查其他内容?
您将如何解决这个问题?
【问题讨论】:
您可能对以 2 为基数的数字感兴趣,即作为 0 和 1 的数组的双精度数。 Double 类具有 位 的转换。上面你可以在数组中有十的幂:在你的例子中是-4。双打本身就有问题,因为 toString 很可能给出 "3.14149999998" 想过写一个 Java 7 的答案,但这似乎毫无意义。piString.toCharArray
的 foreach 和使用 Character::getNumericValue
是我要做的唯一更改。编辑:仍然需要 int 数组的索引...
如果数字很大怎么办?我的意思是:如果一个数字的字符串表示是1E200
,你希望数组变成1,2,0,0
还是1,0,0,0,0,...,0
,有200 个零?
您对(例如)double d = 0.1
的期望是什么?由于浮点恶作剧,这远非微不足道。此外,您为什么认为数据类型之间的转换会导致错误? — 最后,对于未来,此类问题更适合codereview.stackexchange.com。
如果我们了解您为什么这样做,我们也许可以给出更有意义的答案?您将如何处理生成的数组?
【参考方案1】:
我不知道直接的方法,但我认为它更简单:
int[] piArray = String.valueOf(pi)
.replaceAll("\\D", "")
.chars()
.map(Character::getNumericValue)
.toArray();
【讨论】:
想出了相同的解决方案,你有点早:) 我已经使用replaceAll("\\D", "")
过滤任何非数字。
Glains 发布您的解决方案或编辑,因为我认为这是更强大的解决方案。
@Eugene if double 是 1.13E+21 replaceFirst 不起作用
BigDecimal.valueOf(pi).toPlainString()
完全避免了指数形式。【参考方案2】:
既然你想避免强制转换,这里是算术方法,假设你只需要处理正数:
List<Integer> piList = new ArrayList<>();
double current = pi;
while (current > 0)
int mostSignificantDigit = (int) current;
piList.add(mostSignificantDigit);
current = (current - mostSignificantDigit) * 10;
通过首先检查符号然后使用与current = Math.abs(pi)
相同的代码,可以轻松地处理负数。
请注意,由于浮点运算,它会为您提供无法以二进制完美表示的值的结果。
Here 是一个 ideone,它说明了问题以及您可以在哪里尝试我的代码。
【讨论】:
我不敢相信这是唯一提到浮点表示的答案。 +1 虽然算术方法很好,但浮点表示不精确的问题使得这对现实世界的数字毫无用处。当3.1415
产生一个具有 52 个值的List
(3、1、4、1、5,一堆零,然后相当于无用的垃圾“精度”)时,你就大大违反了用户的期望。
@ShadowRanger 是的,绝对同意。我在测试我的解决方案时“记住”了浮点精度问题,并且认为我的答案仍然会引起人们的兴趣(特别是如果它是家庭作业,在这种情况下,如果这个问题是老师希望他的学生遇到的问题,我不会感到惊讶)。使用BigDecimal
仍然可以实现现实世界的算术解决方案,但我不确定它是否比基于字符串的解决方案有很多优势
@Aaron:是的。如果该值以double
的形式出现,则转换为BigDecimal
时会遇到同样的问题; BigDecimal
的 double
构造函数保留了二进制浮点值的精确十进制表示,因此 BigDecimal
帮助的唯一方法是将输入类型更改为 BigDecimal
(将问题推给调用者) ,或通过字符串转换执行隐式舍入(这只是隐藏了它都是有效地基于字符串解析的事实)。您的答案没有错(不是否决),它可能对演示没有任何用处。
@ShadowRanger 字符串解决方案根本也有这个问题;它不太明显,因为字符串格式化程序已经为它提供了一些处理,但它仍然存在。在某种程度上,字符串解决方案只是更好地隐藏了潜在的错误,这通常不是一个好主意。【参考方案3】:
int[] result = Stream.of(pi)
.map(String::valueOf)
.flatMap(x -> Arrays.stream(x.split("\\.|")))
.filter(x -> !x.isEmpty())
.mapToInt(Integer::valueOf)
.toArray();
或者使用java-9
的更安全的方法:
int[] result = new Scanner(String.valueOf(pi))
.findAll(Pattern.compile("\\d"))
.map(MatchResult::group)
.mapToInt(Integer::valueOf)
.toArray();
【讨论】:
你能解释一下为什么它更安全吗,会对此感兴趣。【参考方案4】:你可以在java 8中使用
int[] piArray = piString.chars().map(Character::getNumericValue).toArray();
【讨论】:
【参考方案5】:这也可以
int[] piArray = piString.chars().map(c -> c-'0').toArray();
【讨论】:
【参考方案6】:此解决方案不做任何假设,并使用字符串操作来获得您想要的结果。获取双精度,将其转换为字符串,删除非法字符,然后将每个剩余字符转换为整数并将它们存储在数组中 - 按照它们在双精度中出现的顺序
double pi = 3.1415;
String temp = ""+ pi;
String str = "";
String validChars = "0123456789";
//this removes all non digit characters
//so '.' and '+' and '-' same as string replace(this withThat)
for(int i =0; i<temp.length(); i++)
if(validChars.indexOf(temp.charAt(i)) > -1 )
str = str +temp.charAt(i);
int[] result = new int[str.length()];
for(int i =0; i<str.length(); i++)
result[i] = Integer.parseInt(""+str.charAt(i));
System.out.print(result[i]);
return result; //your array of ints
【讨论】:
以上是关于如何将int转换成double的主要内容,如果未能解决你的问题,请参考以下文章