C# float 到 double 转换
C# float to double conversion
当我执行以下除法并转换为浮点数时,我得到以下值:
float fltval = (float)(1183588296 / 65536.0); //18060.125
执行相同的除法而不进行转换会得到以下双精度值:
double dblval = 1183588296 / 65536.0; //18060.124145507813
我可以为给定的浮点值找到最接近的双精度值吗?
当我执行以下操作时:
double nearestdbl = (double)fltval;
我得到的是浮点值本身,而不是最近的双精度值:
//nearestdbl = 18060.125
如何获得更准确的值 (18060.124145507813),或者在这种情况下更接近的值?
我希望能够以 32 位(浮点)存储结果,并且仍然能够通过将浮点值分配给双精度变量来导出更接近的双精度值。
然而,下面的代码给出了更准确的双精度值:
float f = 125.32f; //125.32
double d = (double)125.32f; //125.31999969482422
为什么它在第二个例子中找到更接近的值而不是在第一个例子中?
谢谢。
转换数据类型时,您总是会得到精度较低的类型...
考虑将 int 转换为 double
时的情况
int intVal = (int)(10.0/4);
double dblVal = 10.0/4;
//dblVal = 2.5 --- intVal = 2
dblVal = intVal;
//dblVal = 2.00;
底线:
不能同时节省内存和精度...
当您将 double 转换为 float 时,double 值会四舍五入为最接近的 float 值。如果 double 值太小或太大而无法放入 float 类型,则结果为零或无穷大。
看看这个 link:
https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/builtin-types/numeric-conversions
(实际上,当我 运行 代码时,我得到的是 18060.13
而不是 18060.125
,但我会在我的回答中继续使用后者。)
Can I find the nearest double value for the given float value?
您似乎以某种方式认为浮点数 18060.125
最接近的双精度值是 18060.124145507813
?这不是真的。浮点数 18060.125
最接近的双精度值是 18060.125
。这个值可以用double
和float
同样准确地表示。
Why does casting 18060.124145507813
to float
gives 18060.125
then?
因为离 double
18060.124145507813
最近的 float
是 18060.125
。请注意,这与您的理解相反。这并不意味着最接近float
18060.125
的double
是18060.124145507813
,因为2个相邻的float
之间有很多double
值值。
不可能返回到 "the double
that you got the float
from",因为当您转换到 float
时,您正在丢失信息。您正在从 64 位值转换为 32 位值。那个信息不会回去。
Why does casting 125.32f work then?
因为 float
不能像 double
那样准确地表示数字 125.32,所以当您转换为 double 时,它会尝试更接近它。尽管看起来 float
可以 100% 准确地表示 125.32
,但这只是 ToString
方法造成的错觉。始终使用某种格式化方法格式化浮点数,例如string.Format
.
当我执行以下除法并转换为浮点数时,我得到以下值:
float fltval = (float)(1183588296 / 65536.0); //18060.125
执行相同的除法而不进行转换会得到以下双精度值:
double dblval = 1183588296 / 65536.0; //18060.124145507813
我可以为给定的浮点值找到最接近的双精度值吗?
当我执行以下操作时:
double nearestdbl = (double)fltval;
我得到的是浮点值本身,而不是最近的双精度值:
//nearestdbl = 18060.125
如何获得更准确的值 (18060.124145507813),或者在这种情况下更接近的值?
我希望能够以 32 位(浮点)存储结果,并且仍然能够通过将浮点值分配给双精度变量来导出更接近的双精度值。
然而,下面的代码给出了更准确的双精度值:
float f = 125.32f; //125.32
double d = (double)125.32f; //125.31999969482422
为什么它在第二个例子中找到更接近的值而不是在第一个例子中?
谢谢。
转换数据类型时,您总是会得到精度较低的类型... 考虑将 int 转换为 double
时的情况int intVal = (int)(10.0/4);
double dblVal = 10.0/4;
//dblVal = 2.5 --- intVal = 2
dblVal = intVal;
//dblVal = 2.00;
底线: 不能同时节省内存和精度...
当您将 double 转换为 float 时,double 值会四舍五入为最接近的 float 值。如果 double 值太小或太大而无法放入 float 类型,则结果为零或无穷大。 看看这个 link: https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/builtin-types/numeric-conversions
(实际上,当我 运行 代码时,我得到的是 18060.13
而不是 18060.125
,但我会在我的回答中继续使用后者。)
Can I find the nearest double value for the given float value?
您似乎以某种方式认为浮点数 18060.125
最接近的双精度值是 18060.124145507813
?这不是真的。浮点数 18060.125
最接近的双精度值是 18060.125
。这个值可以用double
和float
同样准确地表示。
Why does casting
18060.124145507813
tofloat
gives18060.125
then?
因为离 double
18060.124145507813
最近的 float
是 18060.125
。请注意,这与您的理解相反。这并不意味着最接近float
18060.125
的double
是18060.124145507813
,因为2个相邻的float
之间有很多double
值值。
不可能返回到 "the double
that you got the float
from",因为当您转换到 float
时,您正在丢失信息。您正在从 64 位值转换为 32 位值。那个信息不会回去。
Why does casting 125.32f work then?
因为 float
不能像 double
那样准确地表示数字 125.32,所以当您转换为 double 时,它会尝试更接近它。尽管看起来 float
可以 100% 准确地表示 125.32
,但这只是 ToString
方法造成的错觉。始终使用某种格式化方法格式化浮点数,例如string.Format
.