C#将对象转换为Decimal

Cha*_*a W 13 .net c# precision types

我正在尝试将具有该值的对象转换0.39999999999999997为十进制变量而不会丢失精度.

object d = 0.39999999999999997;
Run Code Online (Sandbox Code Playgroud)

我尝试了以下方法.

decimal val1 = Convert.ToDecimal(d); // val1 = 0.4
object val2 = Convert.ChangeType(d, Type.GetType("System.Decimal")); // val2 = 0.4
decimal val3 = decimal.Parse(d.ToString()); // val3 = 0.4
decimal val4 = (Decimal) d; // val4 = 0.4
Run Code Online (Sandbox Code Playgroud)

我知道这不是十进制数据类型无法存储此值的问题,如下所示.

decimal val5 = 0.39999999999999997m; // val5 = 0.39999999999999997;
Run Code Online (Sandbox Code Playgroud)

如何在不丢失精度的情况下将此对象转换为十进制?

如果重要的话,我正在使用.NET Framework 3.5.

Ren*_*iuz 10

我想这是你要找的代码:

object d = 0.39999999999999997;
//Unbox value
double doubleVal = (double)d;

//Convert to string. R format specifier gives a string that can round-trip to an identical number.  
//Without R ToString() result would be doubleAsString = "0.4"
string doubleAsString = doubleVal.ToString("R"); 

//Now that you have doubleAsString = "0.39999999999999997" parse it!
decimal decimalVal = decimal.Parse(doubleAsString);
Run Code Online (Sandbox Code Playgroud)


V4V*_*tta 6

为此,您需要类似地分配它

object d = 0.39999999999999997M;
Run Code Online (Sandbox Code Playgroud)

除非您强迫对象保持精度,否则对象无法保持精度。(如果这不是实际代码,则需要显示其分配方式)

只有这样,这样的事情才会奏效 decimal dec = Convert.ToDecimal(d);

  • 恐怕这是不可能的,因为 object 持有对该值的引用,在您的情况下,除非引用是十进制的,否则您实际上无法获得该精度,它永远无法取消装箱为十进制,因为它是从不装箱。 (3认同)