[英]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 位(浮点数)中,并且仍然能够通过将浮点值分配给 double 变量来推导出更接近的 double 值。
但是,以下代码给出了更准确的 double 值:
float f = 125.32f; //125.32
double d = (double)125.32f; //125.31999969482422
为什么它在第二个示例中而不是在第一个示例中找到更接近的值?
谢谢。
(实际上,当我运行代码时,我得到的是18060.13
而不是18060.125
,但我会在我的回答中继续使用后者。)
我可以为给定的浮点值找到最接近的双精度值吗?
您似乎以某种方式认为浮点数18060.125
的最近双精度18060.125
是18060.124145507813
? 这不是真的。 浮点数18060.125
最接近的双精度18060.125
是18060.125
。 这个值可以用double
和float
同样准确地表示。
为什么将
18060.124145507813
到float
会得到18060.125
呢?
由于最近的float
到double
18060.124145507813
为18060.125
。 请注意,这与您的理解相反。 这并不意味着最接近float
18060.125
double
float
18060.125
是18060.124145507813
,因为在两个相邻的float
之间有许多double
float
。
不可能回到“您从中获得float
的double
”,因为当您转换为float
,您正在丢失信息。 您正在从 64 位值转换为 32 位值。 那些信息不会回来。
为什么铸造 125.32f 工作呢?
因为float
不能像double
那样准确地表示数字 125.32,所以当你转换为 double 时,它会试图进一步接近它。 尽管看起来float
可以准确地表示125.32
100%,但这只是ToString
方法造成的错觉。 始终使用某种格式化方法格式化您的浮点数,例如string.Format
。
转换数据类型时,您总是会得到精度较低的类型......考虑将 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 类型,则结果为零或无穷大。 查看此链接: https : //docs.microsoft.com/en-us/dotnet/csharp/language-reference/builtin-types/numeric-conversions
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.