在C#中实现十进制。是否可以修改它以支持重复小数?

时间:2013-11-08 15:34:20

标签: c# math

C#decimal type存在这个问题:

Console.WriteLine( 1m/3 + 1m/3 == 2m/3 );

False

它只能在除以2或5时精确表示数字,否则结果可能是repeating decimal number

正如在(C# Rational arithmetic)之前的Stack Overflow上所提到的,实现存储两个小数,分子和分母,并且完全执行乘法和除法的东西是非常有可能的。它可以在需要时使用Euclid算法简化分数。还应实现一些显式转换为double或decimal。

有一些合理的商数实现呈现herehere。还有一个Microsoft Solver Foundation结构Rational

如何实现C#中的decimal,是否可以复制此实现并修改它以处理重复 decimal

有一些与SO答案herehere

中提供的重复小数相关的试验

1 个答案:

答案 0 :(得分:9)

decimal实现为有效数,符号和指数,基本上是一个浮点数,其中“点”是小数点而不是二进制点(根据float和{{ 1}})。有关详细信息,请参阅我的article on the topic。 (请注意,与doublefloat不同,double未规范化 - 因此它会保留尾随无关紧要的零值。)

如果您想创建自己的decimal类型,可以这样做,但是您不希望从源代码开始RationalNumber - 并且您将无法更改decimal的含义也意味着你的类型。