在C ++中浮点值从double中截断

时间:2015-02-20 17:55:09

标签: c++ oop double warnings truncation

之前我使用浮点变量编码,从来没有遇到过这个问题。

float  a, b, subtotal, stx;
a=15.95;
b=24.95;
subtotal=a+b;
stx=subtotal*.07;

cout << "Item 1: $" << a << endl;
cout << "Item 2: $" << b << endl;
cout << "\nSubtotal: $" <<subtotal<< endl;
cout << "Sales Tax: $" << stx << endl; 
cout << "Total: $"  << subtotal+stx << endl;

相对严格的前瞻性代码

warning C4305: '=' : truncation from 'double' to 'float'

我理解数据被截断的想法(我也知道你可以在变量的末尾写f。但是如果变量被声明为float,为什么编译器将文字值解释为如果它被声明为浮动,则加倍。

我查了几张其他的门票而且他们不同于我的询问我似乎无法找到一个解决方案,为什么数据被读为双,如果它被声明为浮点数。

4 个答案:

答案 0 :(得分:5)

  

为什么编译器将文字值解释为双精度

因为这是解释文字的方式,除非你添加修饰符来指定不同的类型。

a=15.95f;
       ^ gives the literal "float" type
  

但是如果变量被声明为float ...

表达式的类型决不依赖于表达式的使用方式;所以15.95的类型为double,无论你使用它做什么。如果需要,转换类型以在更大的表达式中使用,这就是在这种情况下给出警告的内容。

答案 1 :(得分:2)

15.95无论分配给什么都被视为双倍;变量的类型只会影响结束持有的值,而不会影响您尝试分配给它的值。始终首先评估作业的右侧。

答案 2 :(得分:1)

构成代码的字符串标记的处理 - 它看到的是&#34; 2.7&#34;或者是15.95,它是数字(以数字开头)和浮点数(有一个。)浮点数的默认容器是双倍的(否则你输入的大多数硬编码数字都会产生错误的结果) 。 在计算表达式的值之后(在这种情况下,只是值本身),它被赋值给一个浮点值,该值不够精确,无法存储结果,因此也就是警告。

答案 3 :(得分:0)

从标准2.14.4起

  

浮动文字的类型是双,除非后缀明确指定。

(强调我的)