5

我有一个带有小数属性的类,我正在使用 JSON.NET 进行序列化和反序列化。我遇到的问题是,如果说十进制值为 100000000000023063.0 ,当我反序列化时,它会转换为 100000000000023000。我检查了 JSON 并且它肯定记录为 100000000000023063.0。

我已经调查过了&

decimal.Parse("100000000000023063.0")

=

100000000000023063.0

var d = (decimal)100000000000023063.0

=

100000000000023000

我可以通过存储为字符串来解决这个问题,并且有一个执行 decimal.Parse() 的属性,但有人知道为什么会这样吗?

4

2 回答 2

12

这是因为100000000000023063.0是一个double常数,然后您将其转换为decimal,并且精度正在丢失。

改为这样写:

var d = 100000000000023063.0M;

M后缀告诉 C# 编译器该数字是一个常量decimal

事实上,您甚至不需要小数点分隔符 - 即1M == 1.0M两者都是decimals。

于 2012-07-03T12:00:39.200 回答
1

这是因为您将双精度转换为小数,而您应该将值定义为小数:即

var q = 100000000000023063.0M;

M 后缀表示数字常量是 Decimal 类型

于 2012-07-03T12:03:00.307 回答