C语言,求高手分析双精度的输入,为啥定义一个双精度,输入函数中少了一个l,只用%f,可以执行,结果错误
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C语言,求高手分析双精度的输入,为啥定义一个双精度,输入函数中少了一个l,只用%f,可以执行,结果错误相关的知识,希望对你有一定的参考价值。
#define PI 3.1415926
#include<stdio.h>
#include<math.h>
void main()
double r,c,s,v;
printf("请输入圆的半径:");
scanf("%lf",&r);
c=2*PI*r;
s=PI*pow(r,2);
v=4.0/3.0*PI*pow(r,3);
printf("c=%f\ns=%f\nv=%f\n",c,s,v);},我写这个程序的目的是要求输入一个园的半径,我立刻可以求出她的面积,体积,周长,然而,我第一次写程序的时候,把输入函数scanf("%lf",&r);写成scanf("%f",&r);,结果,我可以执行,编译没有出现错误,但是,执行的结果却是错误的,此后,我改正了,我每次定义双精度的时候,在输入函数中,都加入了L,这样,结果就正确了,我疑惑的是,我输入函数PRINTF()中定义的是%f都可以执行,为什么输入函数就不可以呢,望高手指点啊,万分感激,跪求高手指点啊,最好说详细一点,做到通俗易懂,谢谢大虾,谢谢老师们
我们可不可这么认为,SCANF()函数中,输入的参数类型必须与定义的类型一致啊,如果定义的类型与SCANF()函数中的控制字符的类型不一致,执行结果就会出错啊
学习C语言始终要记住“曙光在前头”和“千金难买回头看”,“千金难买回头看”是学习知识的重要方法,就是说,学习后面的知识,不要忘了回头弄清遗留下的问题和加深理解前面的知识,这是我们学生最不易做到的,然而却又是最重要的。学习C语言就是要经过几个反复,才能前后贯穿,积累应该掌握的C知识。
那么,我们如何学好《C程序设计》呢?
一.学好C语言的运算符和运算顺序
这是学好《C程序设计》的基础,C语言的运算非常灵活,功能十分丰富,运算种类远多于其它程序设计语言。在表达式方面较其它程序语言更为简洁,如自加、自减、逗号运算和三目运算使表达式更为简单,但初学者往往会觉的这种表达式难读,关键原因就是对运算符和运算顺序理解不透不全。当多种不同运算组成一个运算表达式,即一个运算式中出现多种运算符时,运算的优先顺序和结合规则显得十分重要。在学习中,只要我们对此合理进行分类,找出它们与我们在数学中所学到运算之间的不同点之后,记住这些运算也就不困难了,有些运算符在理解后更会牢记心中,将来用起来得心应手,而有些可暂时放弃不记,等用到时再记不迟。
先要明确运算符按优先级不同分类,《C程序设计》运算符可分为15种优先级,从高到低,优先级为1 ~ 15,除第2、13级和第14级为从右至左结合外,其它都是从左至右结合,它决定同级运算符的运算顺序.
二.学好C语言的四种程序结构
(1)顺序结构
顺序结构的程序设计是最简单的,只要按照解决问题的顺序写出相应的语句就行,它的执行顺序是自上而下,依次执行。
例如;a = 3,b = 5,现交换a,b的值,这个问题就好像交换两个杯子水,这当然要用到第三个杯子,假如第三个杯子是c,那么正确的程序为: c = a; a = b; b = c; 执行结果是a = 5,b = c = 3如果改变其顺序,写成:a = b; c = a; b = c; 则执行结果就变成a = b = c = 5,不能达到预期的目的,初学者最容易犯这种错误。 顺序结构可以独立使用构成一个简单的完整程序,常见的输入、计算,输出三步曲的程序就是顺序结构,例如计算圆的面积,其程序的语句顺序就是输入圆的半径r,计算s = 3.14159*r*r,输出圆的面积s。不过大多数情况下顺序结构都是作为程序的一部分,与其它结构一起构成一个复杂的程序,例如分支结构中的复合语句、循环结构中的循环体等。
(2) 分支结构
顺序结构的程序虽然能解决计算、输出等问题,但不能做判断再选择。对于要先做判断再选择的问题就要使用分支结构。分支结构的执行是依据一定的条件选择执行路径,而不是严格按照语句出现的物理顺序。分支结构的程序设计方法的关键在于构造合适的分支条件和分析程序流程,根据不同的程序流程选择适当的分支语句。分支结构适合于带有逻辑或关系比较等条件判断的计算,设计这类程序时往往都要先绘制其程序流程图,然后根据程序流程写出源程序,这样做把程序设计分析与语言分开,使得问题简单化,易于理解。程序流程图是根据解题分析所绘制的程序执行流程图。
学习分支结构不要被分支嵌套所迷惑,只要正确绘制出流程图,弄清各分支所要执行的功能,嵌套结构也就不难了。嵌套只不过是分支中又包括分支语句而已,不是新知识,只要对双分支的理解清楚,分支嵌套是不难的。下面我介绍几种基本的分支结构。
①if(条件)
这种分支结构中的分支体可以是一条语句,此时“”可以省略,也可以是多条语句即复合语句。它有两条分支路径可选,一是当条件为真,执行分支体,否则跳过分支体,这时分支体就不会执行。如:要计算x的绝对值,根据绝对值定义,我们知道,当x>=0时,其绝对值不变,而x<0时其绝对值是为x的反号,因此程序段为:if(x<0) x=-x;
②if(条件)
else
这是典型的分支结构,如果条件成立,执行分支1,否则执行分支2,分支1和分支2都可以是1条或若干条语句构成。如:求ax^2+bx+c=0的根
分析:因为当b^2-4ac>=0时,方程有两个实根,否则(b^2-4ac<0)有两个共轭复根。其程序段如下:
d=b*b-4*a*c;
if(d>=0)
x1=(-b+sqrt(d))/2a;
x2=(-b-sqrt(d))/2a;
printf(“x1=%8.4f,x2=%8.4f\n”,x1,x2);
else
r=-b/(2*a);
i =sqrt(-d)/(2*a);
printf(“x1=%8.4f+%8.4fi\n”r, i);
printf(“x2=%8.4f-%8.4fi\n”r,i)
③嵌套分支语句:其语句格式为:
if(条件1) ;
else if(条件2)
else if(条件3)
……
else if(条件n)
else
嵌套分支语句虽可解决多个入口和出口的问题,但超过3重嵌套后,语句结构变得非常复杂,对于程序的阅读和理解都极为不便,建议嵌套在3重以内,超过3重可以用下面的语句。
④switch开关语句:该语句也是多分支选择语句,到底执行哪一块,取决于开关设置,也就是表达式的值与常量表达式相匹配的那一路,它不同if…else 语句,它的所有分支都是并列的,程序执行时,由第一分支开始查找,如果相匹配,执行其后的块,接着执行第2分支,第3分支……的块,直到遇到break语句;如果不匹配,查找下一个分支是否匹配。这个语句在应用时要特别注意开关条件的合理设置以及break语句的合理应用。
(3)循环结构:
循环结构可以减少源程序重复书写的工作量,用来描述重复执行某段算法的问题,这是程序设计中最能发挥计算机特长的程序结构,C语言中提供四种循环,即goto循环、while循环、do ?Cwhile循环和for循环。四种循环可以用来处理同一问题,一般情况下它们可以互相代替换,但一般不提倡用goto循环,因为强制改变程序的顺序经常会给程序的运行带来不可预料的错误,在学习中我们主要学习while、do…while、for三种循环。常用的三种循环结构学习的重点在于弄清它们相同与不同之处,以便在不同场合下使用,这就要清楚三种循环的格式和执行顺序,将每种循环的流程图理解透彻后就会明白如何替换使用,如把while循环的例题,用for语句重新编写一个程序,这样能更好地理解它们的作用。特别要注意在循环体内应包含趋于结束的语句(即循环变量值的改变),否则就可能成了一个死循环,这是初学者的一个常见错误。
在学完这三个循环后,应明确它们的异同点:用while和do…while循环时,循环变量的初始化的操作应在循环体之前,而for循环一般在语句1中进行的;while 循环和for循环都是先判断表达式,后执行循环体,而do…while循环是先执行循环体后判断表达式,也就是说do…while的循环体最少被执行一次,而while 循环和for就可能一次都不执行。另外还要注意的是这三种循环都可以用break语句跳出循环,用continue语句结束本次循环,而goto语句与if构成的循环,是不能用break和 continue语句进行控制的。
顺序结构、分支结构和循环结构并不彼此孤立的,在循环中可以有分支、顺序结构,分支中也可以有循环、顺序结构,其实不管哪种结构,我们均可广义的把它们看成一个语句。在实际编程过程中常将这三种结构相互结合以实现各种算法,设计出相应程序,但是要编程的问题较大,编写出的程序就往往很长、结构重复多,造成可读性差,难以理解,解决这个问题的方法是将C程序设计成模块化结构。
(4)模块化程序结构
C语言的模块化程序结构用函数来实现,即将复杂的C程序分为若干模块,每个模块都编写成一个C函数,然后通过主函数调用函数及函数调用函数来实现一大型问题的C程序编写,因此常说:C程序=主函数+子函数。 因此,对函数的定义、调用、值的返回等中要尤其注重理解和应用,并通过上机调试加以巩固。
三.掌握一些简单的算法
编程其实一大部分工作就是分析问题,找到解决问题的方法,再以相应的编程语言写出代码。这就要求掌握算法,根据我们的《C程序设计》教学大纲中,只要求我们掌握一些简单的算法,在掌握这些基本算法后,要完成对问题的分析就容易了。如两个数的交换、三个数的比较、选择法排序和冒泡法排序,这就要求我们要清楚这些算法的内在含义
结语:当我们把握好上述几方面后,只要同学们能克服畏难、厌学、上课能专心听讲,做好练习与上机调试,其实C语言并不难学
C源程序的关键字---------------------------------------------------------------------------------------
所谓关键字就是已被C语言本身使用, 不能作其它用途使用的字。例如关键字不能用作变量名、函数名等
由ANSI标准定义的C语言关键字共32个 :
auto double int struct break else long switch
case enum register typedef char extern return union
const float short unsigned continue for signed void
default goto sizeof volatile do if while static
根据关键字的作用,可以将关键字分为数据类型关键字和流程控制关键字两大类。
1 数据类型关键字
A基本数据类型(5个)
void :声明函数无返回值或无参数,声明无类型指针,显式丢弃运算结果
char :字符型类型数据,属于整型数据的一种
int :整型数据,通常为编译器指定的机器字长
float :单精度浮点型数据,属于浮点数据的一种
double :双精度浮点型数据,属于浮点数据的一种
B 类型修饰关键字(4个)
short :修饰int,短整型数据,可省略被修饰的int。
long :修饰int,长整形数据,可省略被修饰的int。
signed :修饰整型数据,有符号数据类型
unsigned :修饰整型数据,无符号数据类型
C 复杂类型关键字(5个)
struct :结构体声明
union :共用体声明
enum :枚举声明
typedef :声明类型别名
sizeof :得到特定类型或特定类型变量的大小
D 存储级别关键字(6个)
auto :指定为自动变量,由编译器自动分配及释放。通常在栈上分配
static :指定为静态变量,分配在静态变量区,修饰函数时,指定函数作用域为文件内部
register :指定为寄存器变量,建议编译器将变量存储到寄存器中使用,也可以修饰函数形参,建议编译器通过寄存器而不是堆栈传递参数
extern :指定对应变量为外部变量,即标示变量或者函数的定义在别的文件中,提示编译器遇到此变量和函数时在其他模块中寻找其定义。
const :与volatile合称“cv特性”,指定变量不可被当前线程/进程改变(但有可能被系统或其他线程/进程改变)
volatile :与const合称“cv特性”,指定变量的值有可能会被系统或其他进程/线程改变,强制编译器每次从内存中取得该变量的值
2 流程控制关键字
A 跳转结构(4个)
return :用在函数体中,返回特定值(或者是void值,即不返回值)
continue :结束当前循环,开始下一轮循环
break :跳出当前循环或switch结构
goto :无条件跳转语句
B 分支结构(5个)
if :条件语句
else :条件语句否定分支(与if连用)
switch :开关语句(多重分支语句)
case :开关语句中的分支标记
default :开关语句中的“其他”分治,可选。
C 循环结构(3个)
for :for循环结构,for(1;2;3)4;的执行顺序为1->2->4->3->2...循环,其中2为循环条件
do :do循环结构,do 1 while(2); 的执行顺序是 1->2->1...循环,2为循环条件
while :while循环结构,while(1) 2; 的执行顺序是1->2->1...循环,1为循环条件
以上循环语句,当循环条件表达式为真则继续循环,为假则跳出循环。
[编辑本段]新标准
在ANSI标准化后,C语言的标准在一段相当的时间内都保持不变,尽管C++继续在改进。(实际上,Normative Amendment1在1995年已经开发了一个新的C语言版本。但是这个版本很少为人所知。)标准在90年代才经历了改进,这就是ISO9899:1999(1999年出版)。这个版本就是通常提及的C99。它被ANSI于2000年三月采用。
在C99中包括的特性有:
对编译器限制增加了,比如源程序每行要求至少支持到 4095 字节,变量名函数名的要求支持到 63 字节 (extern 要求支持到 31)
预处理增强了。例如:
宏支持取参数 #define Macro(...) __VA_ARGS__
使用宏的时候,参数如果不写,宏里用 #,## 这样的东西会扩展成空串。(以前会出错的)
支持 // 行注释(这个特性实际上在C89的很多编译器上已经被支持了)
增加了新关键字 restrict, inline, _Complex, _Imaginary, _Bool
支持 long long, long double _Complex, float _Complex 这样的类型
支持 <: :> <% %> %: %:%: ,等等奇怪的符号替代
支持了不定长的数组。数组的长度就可以用变量了。声明类型的时候呢,就用 int a[*] 这样的写法。不过考虑到效率和实现,这玩意并不是一个新类型。所以就不能用在全局里,或者 struct union 里面,如果你用了这样的东西,goto 语句就受限制了。
变量声明不必放在语句块的开头,for 语句提倡这么写 for(int i=0;i<100;++i) 就是说,int i 的声明放在里面,i 只在 for 里面有效。(VC没有遵守这条标准,i 在 for 外也有效)
当一个类似结构的东西需要临时构造的时候,可以用 (type_name) 这有点像 C++ 的构造函数
初始化结构的时候现在可以这样写:
struct hehe[] = ;
struct hehe = // 3,4 是对 .c,.d 赋值的
字符串里面,\u 支持 unicode 的字符
支持 16 进制的浮点数的描述
所以 printf scanf 的格式化串多支持了 ll / LL (VC6 里用的 I64) 对应新的 long long 类型。
浮点数的内部数据描述支持了新标准,这个可以用 #pragma 编译器指定
除了已经有的 __line__ __file__ 以外,又支持了一个 __func__ 可以得到当前的函数名
对于非常数的表达式,也允许编译器做化简
修改了对于 / % 处理负数上的定义,比如老的标准里 -22 / 7 = -3, -22 % 7 = -1 而现在 -22 / 7 = -4, -22 % 7 = 6
取消了不写函数返回类型默认就是 int 的规定
允许 struct 定义的最后一个数组写做 [] 不指定其长度描述
const const int i; 将被当作 const int i; 处理
增加和修改了一些标准头文件, 比如定义 bool 的 <stdbool.h> 定义一些标准长度的 int 的 <inttypes.h> 定义复数的 <complex.h> 定义宽字符的 <wctype.h> 有点泛型味道的数学函数 <tgmath.h> 跟浮点数有关的 <fenv.h>。<stdarg.h> 里多了一个 va_copy 可以复制 ... 的参数。<time.h> 里多了个 struct tmx 对 struct tm 做了扩展
输入输出对宽字符还有长整数等做了相应的支持
相对于c89的变化还有
1、增加restrict指针
C99中增加了公适用于指针的restrict类型修饰符,它是初始访问指针所指对象的惟一途径,因此只有借助restrict指针表达式才能访问对象。restrict指针指针主要用做函数变元,或者指向由malloc()函数所分配的内存变量。restrict数据类型不改变程序的语义。
如果某个函数定义了两个restrict指针变元,编译程序就假定它们指向两个不同的对象,memcpy()函数就是restrict指针的一个典型应用示例。C89中memcpy()函数原型如下:
代码: void *memcpy (void *s1, const void *s2, size_t size);
如果s1和s2所指向的对象重叠,其操作就是未定义的。memcpy()函数只能用于不重叠的对象。C99中memcpy()函数原型如下:代码: void *memcpy(void *restrict s1, const void *restrict s2,size_t size);
通过使用restrict修饰s1和s2 变元,可确保它们在该原型中指向不同的对象。
2、inline(内联)关键字
内联函数除了保持结构化和函数式的定义方式外,还能使程序员写出高效率的代码.函数的每次调用与返回都会消耗相当大的系统资源,尤其是当函数调用发生在重复次数很多的循环语句中时.一般情况下,当发生一次函数调用时,变元需要进栈,各种寄存器内存需要保存.当函数返回时,寄存器的内容需要恢复。如果该函数在代码内进行联机扩展,当代码执行时,这些保存和恢复操作旅游活动会再发生,而且函数调用的执行速度也会大大加快。函数的联机扩展会产生较长的代码,所以只应该内联对应用程序性能有显著影响的函数以及长度较短的函数
3、新增数据类型
_Bool
值是0或1。C99中增加了用来定义bool、true以及false宏的头文件夹<stdbool.h>,以便程序员能够编写同时兼容于C与C++的应用程序。在编写新的应用程序时,应该使用
<stdbool.h>头文件中的bool宏。
_Complex and _Imaginary
C99标准中定义的复数类型如下:float_Complex; float_Imaginary; double_Complex; double_Imaginary; long double_Complex; long double_Imaginary.
<complex.h>头文件中定义了complex和imaginary宏,并将它们扩展为_Complex和_Imaginary,因此在编写新的应用程序时,应该使用<stdbool.h>头文件中的complex和imaginary宏。
long long int
C99标准中引进了long long int(-(2e63 - 1)至2e63 - 1)和unsigned long long int(0 - 2e64 - 1)。long long int能够支持的整数长度为64位。
4、对数组的增强
可变长数组
C99中,程序员声明数组时,数组的维数可以由任一有效的整型表达式确定,包括只在运行时才能确定其值的表达式,这类数组就叫做可变长数组,但是只有局部数组才可以是变长的.
可变长数组的维数在数组生存期内是不变的,也就是说,可变长数组不是动态的.可以变化的只是数组的大小.可以使用*来定义不确定长的可变长数组。 参考技术A %lf对应double型,%f对应float型。输入的时候都是浮点数嘛,但是在现代编译器里这两种浮点型的大小不一样。double=8, float=4字节,如果你选的类型不对,它写进去的内容就是错位的 参考技术B 问题补充那里,你的理解是正确的。但是你要知道为什么会这样,比如你定一个int a;
scanf("%f", &a); 这时你输入5.639,那a的值就是5,他会把5.639强制转化成int值,为5。同理printf也是一样的 参考技术C 最好养成这样一个好习惯,尽可能的避免出现错误,就是定义变量为什么类型的数,输入输出就应该对应是什么类型的数,这样会省去不必要的麻烦! 参考技术D double r,c,s,v;变量为double型,15位有效数字,而float为7位有效数字,小数点后只有6位。
printf里面做了一个强制转换
为啥我不能将数字转换为双精度数?
【中文标题】为啥我不能将数字转换为双精度数?【英文标题】:Why can't I convert a Number into a Double?为什么我不能将数字转换为双精度数? 【发布时间】:2018-12-23 00:41:07 【问题描述】:weight
是一个字段(Firestore中的数字),设置为100
。
int weight = json['weight'];
double weight = json['weight'];
int weight
工作正常,按预期返回 100
,但 double weight
崩溃(Object.noSuchMethod
异常)而不是返回 100.0
,这是我的预期。
但是,以下工作:
num weight = json['weight'];
num.toDouble();
【问题讨论】:
double weight = json['weight'].toDouble()
?
你可以这样做:double weight = json['weight'] + 0.0;
它是 Dart,而不是 Flutter 本身。 Dart 对打字非常严格。最终,它使代码更清晰。但需要一点时间来适应它——Dart 不会为你神奇地转换变量。
【参考方案1】:
从 Firestore 解析 100
时(实际上不支持“数字类型”,但 converts it),按照标准,它将被解析为 int
。Dart 不会自动“智能”地转换这些类型。实际上,您不能将int
转换为double
,这是您面临的问题。如果可能的话,你的代码就可以正常工作了。
解析
相反,您可以自己解析:
double weight = json['weight'].toDouble();
铸造
同样有效的方法是将 JSON 解析为 num
,然后将其分配给 double
,这会将 num
转换为 double
。
double weight = json['weight'] as num;
一开始这似乎有点奇怪,实际上Dart Analysis tool(例如内置于 VS Code 和 IntelliJ 的 Dart 插件中)会将其标记为 “不必要的演员表”,事实并非如此。
double a = 100; // this will not compile
double b = 100 as num; // this will compile, but is still marked as an "unnecessary cast"
double b = 100 as num
编译是因为 num
is the super class 的 double
和 Dart 将 super 转换为子类型,即使没有显式转换。显式演员表如下:
double a = 100 as double; // does not compile because int is not the super class of double
double b = (100 as num) as double; // compiles, you can also omit the double cast
Here is a nice read 关于“Dart 中的类型和转换”。
说明
发生在你身上的事情如下:
double weight;
weight = 100; // cannot compile because 100 is considered an int
// is the same as
weight = 100 as double; // which cannot work as I explained above
// Dart adds those casts automatically
【讨论】:
这大多是错误的。 Dart 永远不会为您将整数值转换为双精度值,您必须调用.toDouble()
。对数字执行 as
转换不会更改其类型。如果您在 VM 上运行 double x = 42 as num;
,您将收到运行时错误,因为整数不是双精度数。它在编译为 JavaScript 时可以工作,但这只是因为 JavaScript 中的所有数字实例都是双精度数,即使是 int
也是如此。
@lrn 它工作正常。我在发布之前对其进行了测试。您也可以查看我链接的内容。
我可能误读了您所写的内容,如果是这样,我深表歉意。我对您所说的工作内容感到非常困惑(.toDouble()
有效,其他所有内容在 VM 上运行时都无效,但从文本中不清楚它是不应该工作的示例)。 “解析”部分实际上是从 int 转换为 double,“转换”部分正在做的事情在运行时都失败了。所以,也许我只是说信息不明确。
不确定您指的是哪个链接,但我对 Dart 类型系统和运行时行为非常熟悉。我是从 Dart 2 静态和运行时类型系统的角度说的,但我在这里所说的也适用于 --checked
更多的 Dart 1(它检查类型而不是忽略它们并允许任何东西)。【参考方案2】:
你可以在一行中完成:
double weight = (json['weight'] as num).toDouble();
【讨论】:
【参考方案3】:您可以解析数据,如下所示:
这里的文档是Map<String,dynamic>
double opening = double.tryParse(document['opening'].toString());
【讨论】:
这可以作为评论安全地发表【参考方案4】:在 Dart 中,int
和 double
是不同的类型,都是 num
的子类型。
数字类型之间没有自动转换。如果你写:
num n = 100;
double d = n;
您将收到运行时错误。 Dart 的静态类型系统允许不安全的向下转换,因此 n
到 d
的不安全分配(不安全,因为并非所有 num
值都是 double
值)被隐式处理为:
num n = 100;
double d = n as double;
as double
检查该值实际上是double
(或null
),如果不是则抛出。如果该检查成功,则它可以安全地将值分配给d
,因为已知它与变量的类型匹配。
这就是这里发生的事情。 json['weight']
的实际值(可能是静态类型 Object
或 dynamic
)是值为 100 的 int
对象。将其分配给 int
有效。将其分配给num
有效。将其分配给double
throws。
如果数字没有小数或指数部分,Dart JSON 解析器会将其解析为整数(0.0
是双精度数,0e0
是双精度数,0
是整数)。这在大多数情况下非常方便,但在像您这样需要double
但创建 JSON 的代码并没有将其写为双精度的情况下偶尔会很烦人。
在这种情况下,您只需在提取值时在值上写上.toDouble()
。这是对实际双打的无操作。
附带说明一下,编译为 JavaScript 的 Dart 将所有数字表示为 JavaScript Number 类型,这意味着所有数字都是双精度数。在 JS 编译的代码中,所有的整数都可以被赋值为 double 而无需转换。当代码在非 JS 实现(如 Flutter、Dart VM/server 或 iOS 的提前编译)上运行时,这将不起作用,所以不要依赖它,或者你的代码将不可移植。
【讨论】:
您没有收到运行时错误。我不明白你从哪里得到的。也许曾经是这种情况,但您可以在 VM 上尝试。既没有编译错误,也没有运行时错误。 刚试过:main() num n = 100; double d = n;
在 Dart 2 VM 上运行会得到Unhandled exception: type 'int' is not a subtype of type 'double'
。添加as double
没有区别。该分配曾经在 unchecked Dart 1 代码中工作,但如果您在运行 Dart 1 时使用--checked
,它将以完全相同的方式失败。 int
不是 double
。 (同样,当编译成 JavaScript 时,整数实际上也是双精度数,因为 JavaScript 只有一种数字类型)。【参考方案5】:
像这样简单地将int
转换为double
int a = 10;
double b = a + 0.0;
【讨论】:
为什么要投反对票?我已经测试了这个解决方案它工作正常。如果您有带有 int 数据的动态列表,那么类型转换也会失败,那么只有这个解决方案有效。请尝试一次否决票。以上是关于C语言,求高手分析双精度的输入,为啥定义一个双精度,输入函数中少了一个l,只用%f,可以执行,结果错误的主要内容,如果未能解决你的问题,请参考以下文章
为啥 C/RUST 中的一个加法计算在结果 ASM 中有 3 个双精度浮点加法工具?