[英]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.