在c ++中浮动舍入

时间:2017-02-22 04:08:21

标签: c++

int a,b;
a = 2147483647;
b = 1000;
printf("%.2f",(float)a/(float)b);

这应该打印2147483.65,而是打印出2147483.75请帮助

3 个答案:

答案 0 :(得分:3)

将a和b转换为double而不是float

<强>原因

程序中a的值为2147483647,这是4字节长(32位)数据类型(如int)可以存储的最高值。但是float即使是32位数据类型也会截断它,因为它也必须考虑小数位数。如果使用double代替它,它的长度为8个字节,因此可以轻松容纳2147483647或2147483.65。

答案 1 :(得分:0)

这里的问题是你的内存空间不足以存储浮点值。我将从更广泛的视角解释这个问题。

2147483647是可以存储在32位signed int变量中的最大数字。如果我们以二进制格式看到它,它是:1111111111111111111111111111111。现在,即使有符号浮点数也是4个字节(32位有符号),浮点变量也必须存储小于1且大于0的值。因此,您在以下行中遇到问题:

printf("%.2f",(float)a/(float)b);

因为当你把一个浮雕放到浮动上时,你无意中做了(float)(2147483647)。现在因为这个数字单独需要31位(第32位用于值的符号;这里它是零,因为数字是正数),并且float为值的小数部分分配一些空间,你有少于31位为相同的值。这会导致浮动溢出,并导致您遇到的问题。

因此,要解决此问题,您应该将a转换为加倍。将b转换为double是不必要的,因为它适合浮点数。此外,在数学运算中转换一个变量就足以让编译器将结果视为转换为其中一个变量的类型。

所以简单地做:

printf("%.2f",(double)a/b);

您将最终结果投射到 double 类型,并为您提供所需的结果 2147483.65

顺便说一句,就像一个旁边,double有8个字节的内存,是float的两倍大小。因此,在需要精度的操作中使用double是更实际的。

答案 2 :(得分:-2)

float替换为double

#include <iostream>
using namespace std;

int main() {
    // your code goes here
    long a,b;
    a = 2147483647;
    b = 1000;
    printf("%.2f",(double)a/(double)b);  // No need to cast both a/(double)b is enough
    return 0;
}

o / p :2147483.65 Check here

这是因为浮点数据类型也必须处理小数部分。