我想将long转换为float / double但是将值转换为round。如果不进行舍入,我该如何转换?
这是我的代码:
#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
救命!
正如Mark Ransom在评论中已经提到的那样,您看到的输出只是存储在float或double值中的实际值的简短形式。您可以使用,即std::setprecision(15)
查看更多数字。
标准单精度浮点值具有32位,其中23位保留给尾数。当浮点值不为零时,假设尾数的最高有效位为1(但不存储)。这意味着您有24位存储空间,尾数可以容纳的最大值是2 ^ 24或16777216.如您所见,您可以存储大约7位数而不会丢失精度。我说'about',因为并非所有浮点值的十进制表示都可以用二进制格式的相同精度表示。
这是一个有趣的实验:
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
“如果没有四舍五入,我怎么能转换?”将整数值表示为浮点值始终由于其技术表示而对它们进行舍入。看到这里Convert int to double