【问题标题】:In C++ float value being truncated from double在 C++ 中,浮点值被从 double 截断
【发布时间】:2015-02-20 17:55:08
【问题描述】:

我以前使用浮点变量进行编码,但从未遇到过这个问题。

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。但是如果变量被声明为浮点数,为什么编译器会将文字值解释为双精度值它被声明为浮点数。

我查找了其他几张票,它们与我的查询不同,我似乎无法找到解决方案,说明如果数据声明为浮点数,为什么数据被读取为双精度数。

【问题讨论】:

  • 15.95 始终是 double。总是。使用方式不会影响其类型。
  • 为什么要标记为 OOP?

标签: c++ oop double warnings truncation


【解决方案1】:

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

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

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

但是如果变量被声明为浮点数...

表达式的类型从不取决于表达式的使用方式;所以15.95double 类型,无论你用它做什么。如有必要,将转换类型以用于更大的表达式,这就是在这种情况下发出警告的原因。

【讨论】:

    【解决方案2】:

    15.95 无论分配给什么,都被视为双精度数;变量的类型仅影响它最终持有的值,而不影响您尝试分配给它的值。赋值的右侧总是首先被评估。

    【讨论】:

      【解决方案3】:

      处理组成您的代码的字符串标记 - 它看到的是“2.7”或 15.95,它是数字(以数字开头)和浮点(具有 .)浮点数的默认容器是双精度(否则,您输入的大多数硬编码数字都会得到非常错误的结果。 在计算表达式的值之后(在本例中,只是值本身),它被分配给一个浮点值,该值不够精确,无法存储结果,因此会发出警告。

      【讨论】:

        【解决方案4】:

        从标准 2.14.4

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

        (强调我的)

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-04-29
          • 2019-09-12
          • 1970-01-01
          • 2013-12-31
          相关资源
          最近更新 更多