存储无限小数C#

时间:2011-12-07 23:56:44

标签: c# math decimal

我需要对分数进行一些计算,结果具有无限小数。 例如:

240/360=0.666666...

输出具有无限小数,当我将其乘以整数时,结果必须是整数。所以我用这种方式编码:

result = someInteger * decimal.divide(240/360);

(尝试使用someInteger = 2,700) 但结果有十进制值,一些计算器甚至电子表格会输出整数结果。 如何在c#中获得相同的结果?

由于

4 个答案:

答案 0 :(得分:12)

  

输出具有无限小数,当我将其乘以整数时,结果必须是整数。

这不会真的发生。

你可以做的是小心舍入(乘法后)。

或者代替

 result = someInteger * decimal.divide(240/360);

你可以使用

 result = someInteger * 240 / 360;

那有什么问题?

当你非常认真地使用分数和保持精度时,你需要一种特殊的类型:

struct Rational 
{
  public readonly int Numerator;
  public readonly int Denominator;

  // lots of members, including operators
}

libraries and examples如何做到这一点。

但请注意,你仍然无法完全代表π。

答案 1 :(得分:1)

你可以将分子和分母分别作为整数存储并在除数之前将分子乘以,这不会解决每个问题,尽管1/3 * 2仍会给出无限小数。这也仅适用于有理数。

答案 2 :(得分:0)

使用Math.Round()

result = someInteger * decimal.divide(240/360);

result = Math.Round(result);

返回整数是你要求做的正确吗?

答案 3 :(得分:0)

许多应用程序通过中间计算执行伪分数数学,其准确度高于最终需要/输出给用户的程度(Office执行此操作)。如果这不是您想要的,并且您想要执行真正的小数数学,那么请搜索Fractions实现。似乎有一个不错的实施here。这种实现的问题在于,由于有效,因此在功能上是正确的。因此,如果您的应用程序需要使用分数执行数百万次操作,那么其性能可能会受到影响。