日期:2014-05-18  浏览次数:20795 次

double转换decimal问题
我是个ASP.NET的初学着,如果问的很白痴,不要拿扳砖拍我啊

问题如下:
===========================================================================
    long   Number1=1;
    long   Number2=3;
    decimal   Number3=(decimal)Number1/Number2;
---------------------------------------
    double   Number7=1;
    double   Number8=3;
    decimal   Number9   =(decimal)Number7/(decimal)Number8;
---------------------------------------
    decimal   Number4=1;
    decimal   Number5=3;
    double   Number6   =(double)Number4/Number5;
---------------------------------------
    double   Number7=1;
    double   Number8=3;
    decimal   Number9   =(decimal)Number7/Number8;

===========================================================================
为什么前面两段代码是正确的,后面两段却都是错误的.那个高人给我解释下吗?

------解决方案--------------------
decimal Number4 = 1;
decimal Number5 = 3;
double Number6 = Convert.ToDouble(Number4/Number5);
double Number7 = 1;
double Number8 = 3;
decimal Number9 = Convert.ToDecimal(Number7/Number8);
-------------------------------------------------------
以上代码已经通过编译
------解决方案--------------------
第三段代码中:(double)Number4/Number5;是先把Number4强制转换为double类型然后再除以Number5,然而Number5是一个decimal类型的,decimal类型和Double类型是不能相除的。
把代码改成::(double)(Number4/Number5);就没错了。
第四段代码也是一样
------解决方案--------------------
Convert,楼主好好看看这个类里的一些静态函数
------解决方案--------------------
decimal Number4=1;
decimal Number5=3;
double Number6 =(double)(Number4/Number5);
这个一定是正确的!因为(double)Number4要首先计算,然后和Number5相除,作为一种强类型的语言,不允许decimal和double的两个数相除!这是因为运算符的优先级问题!

------解决方案--------------------
为什么不能相除,加减乘除都不可以。。。。为什么Long可以和decimal运算?
========
没有为什么,C# 对四则运算的操作数类型是这样规定的,

实际上,这里有一个隐式、显示类型转换的知识点

当四则运算的两个操作数
其中一个为 double,另一个数为 int, short, byte, float,
编译器会自动执行隐式转换,将 int, short, byte, float 转为 double 再运算
double 的精度最高

但比较特殊的是无法在 decimal 与 double 之间做隐式转换,他们之间不管谁向谁转换,都必须进行显示的转换

Samples as:

short _short = 911;
int _int = 911;
float _float = 911f;
double _double = 911;
decimal _decimal = 911m;
_double = _int; // ok, 隐式转换(自动转换)
_double = _float; // ok
_float = _int; // ok
_float = (float)_double; // ok, 显示转换,会发生精度丢失
//_float = _double; // error,
_int = _short; // ok
//_int = _float; // error
_double = (double)_decimal; // ok, 显示转换
_decimal = (decimal)_double; // ok, 显示转换
// _double = _decimal; // error, CS0266: 无法将类型“decimal”隐式转换为“double”。存在一个显式转换(是否缺少强制转换?)
// _decimal = _double; // error, CS0266: 无法将类型“double”隐式转换为“decimal”。存在一个显式转换(是否缺少强制转换?)

其他情况类型,两个操作数类型不一致的时候,向精度高的类型转换,
只有两个操作数的类型一致,才能分配存储空间,进而进行运算

但是 double 与 decimal 无法进行隐式的转换,

Hope helpful!