Why can't you assign a number with a decimal point to the decimal type directly without using type suffix? isn't this kind of number considered a number of type decimal?

``````decimal bankBalance = 3433.20; // ERROR!
``````

#### #0

Edit: I may have missed the last part of the question, so the overview below is hardly useful.

Anyway, the reason you can't do what you're trying to do is because there is no implicit conversion between floating point types and `decimal`. You can however assign it from an integer, as there is an implicit conversion from int to decimal.

You can, but you have to use this syntax (or do an explicit cast to decimal).

``````decimal bankBalance = 3433.20m;
``````

and for floats it is

``````float bankBalance = 3433.20f;
``````

default is double

``````double bankBalance = 3444.20;
``````

#### #1

Actually, hidden spec feature: you can ;-p

``````decimal bankBalance = (decimal)3433.20;
``````

This is genuinely parsed by the compiler as a decimal (not a float and a cast). See the IL to prove it. Note that the precision gets truncated, though (this has 1 decimal digit, not the 2 you get from the `M` version).

IL generated:

``````L_0001: ldc.i4 0x861c
L_0006: ldc.i4.0
L_0007: ldc.i4.0
L_0008: ldc.i4.0
L_0009: ldc.i4.1
L_000a: newobj instance void [mscorlib]System.Decimal::.ctor(int32, int32, int32, bool, uint8)
L_000f: stloc.0
``````

Compared to:

``````decimal bankBalance = 3433.20M;
``````

Which generates:

``````L_0001: ldc.i4 0x53d18
L_0006: ldc.i4.0
L_0007: ldc.i4.0
L_0008: ldc.i4.0
L_0009: ldc.i4.2
L_000a: newobj instance void [mscorlib]System.Decimal::.ctor(int32, int32, int32, bool, uint8)
L_000f: stloc.0
``````

The only difference is the decimal digits (1 vs 2, and a factor of 10, accordingly)

#### #2

This

``````decimal bankBalance = 3433.20M;
``````

will work. The reason is that float and decimal are very different types. float will give you an extremely close approximation of the number you enter, but decimal will give you the exact number. 99% of the time you wont notice the difference, and should just use float.

#### #3

1. All numerical literals with a decimal point are inferred to be of type `double` by the C# compiler, consequently, `3433.20` is a `double` by default.

2. `double` numbers do not implicitly convert to `decimal` because although `decimal` is more precise than `double` it covers a shorter range so overflow is possible during a cast from double to decimal.

`double`'s range: `±(~10^−324 to 10^308)` with 15 or 16 significant figures.

`decimal`'s range: `±(~10^-28 to 10^28)` with 28 or 29 significant figures.

#### #4

See the MSDN page on decimal which explains that there is no implicit conversion between normal float types and decimal.

Try

`decimal bankBalance = 3433.20m;`

#### 阅读全文

NHibernate3.2代码映射。当我们创建包关系时，什么意思一人公寓？

delphi中的补丁程序调用

Java并发-写入同一数组的不同索引

（Cocos2D）检测正在显示哪个CCScene？