C ++-将long转换为float或double值

时间:2019-03-06 03:32:15

标签: c++ double long-integer

我想将long转换为float / double,但是强制舍入该值。如何在不进行四舍五入的情况下进行转换?

这是我的代码:

#include <cmath>
#include <iostream>

int main()
{
    const uint32_t UW = 1000;
    int txPower = 3012916;

    long x = std::stoi("3012916") * UW;
    std::cout << "x = " << x << std::endl;

    auto xFloat = (float)x;
    std::cout << "x float = " << xFloat << std::endl;

    auto xDouble = (double)x;
    std::cout << "xDouble = " << xDouble << std::endl;
    std::cout << "xDouble value cast = " << (double)3012916000 << std::endl;

    return 0;
}

提供此输出:

x = 3012916000                                                                                                                                              
x float = 3.01292e+09                                                                                                                                       
xDouble = 3.01292e+09                                                                                                                                       
xDouble value cast = 3.01292e+09

帮助!

2 个答案:

答案 0 :(得分:3)

正如Mark Ransom在评论中提到的那样,您看到的输出只是存储在 float double 中的实际值的简写形式值。您可以使用std::setprecision(15)来查看更多数字。

标准单精度浮点值具有32位,其中23位保留为尾数。当浮点值不为零时,尾数的最高有效位被假定为一(但未存储)。这意味着您有24位存储空间,尾数可以容纳的最大值为2 ^ 24或16777216。如您所见,可以存储大约7位数字而不会损失精度。之所以说“大约”,是因为并非所有浮点值的十进制表示都可以以相同的精度以二进制格式表示。

这是一个有趣的实验:

long n0 = 16777210;
for (int i = 0; i < 10; i++)
{
    long n = n0 + i;
    std::cout << "n=" << n << " / ((float)n)=" << std::setprecision(15) << ((float)n) << std::endl;
}

输出为:

n=16777210 / ((float)n)=16777210
n=16777211 / ((float)n)=16777211
n=16777212 / ((float)n)=16777212
n=16777213 / ((float)n)=16777213
n=16777214 / ((float)n)=16777214
n=16777215 / ((float)n)=16777215
n=16777216 / ((float)n)=16777216
n=16777217 / ((float)n)=16777216
n=16777218 / ((float)n)=16777218
n=16777219 / ((float)n)=16777220

数字3012916000太大,无法精确地保存在单个精度浮点值中。当您像这样输出号码时:

std::cout << "x float = " << std::setprecision(15) << xFloat << std::endl;

然后输出为:

x float = 3012915968

双精度值的尾数为52 + 1位,因此您的数字可以精确存储:

std::cout << "xDouble = " << std::setprecision(15) << xDouble << std::endl;

输出:

xDouble = 3012916000

答案 1 :(得分:-1)

“如何在不进行四舍五入的情况下进行转换?” 由于其技术表示形式,将整数值表示为浮点值总是将它们四舍五入。 看这里 Convert int to double