2011-12-07 37 views
0

我需要做一些计算分数,结果有无限小数。 例如:存储无限小数C#

240/360=0.666666... 

输出具有无限小数时,我乘这个由整数的结果必须是整数。所以我编写这样:

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

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

感谢

+0

你想四舍五入或截断吗?尝试将结果转换为像这样的'var myIntResult =(int)结果;' – PostMan

+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如何做到这一点。

但请注意,您仍然无法准确表示π。

+0

在你的建议(结果= someInteger * 240/360;)什么操作具有更高的优先级?或者哪个会先执行? –

+0

从左到右...... someInteger * 240,然后是对那个/ 360的答案。 –

+5

我注意到,当然,如果你想要的话,你可以完全代表pi,*只是没有整数有理数据库*。 –

0

使用Math.Round()

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

result = Math.Round(result); 

返回一个整数是你问做对了什么?

+0

我不想整数结果,我只想知道输出是否实际上是一个整数 –

+1

所以你想方法返回一个真/假的语句,如果它是一个整数?因为这完全不是你的问题所指出的。 –

+0

是的,实际上我正在工作的代码做了这样的比较,但我的问题是这个operatin –

1

你可以将分子和分母分别存储为整数,并在分割之前先乘以分子,但这不会解决所有问题,因为1/3 * 2仍然会给出无穷小数。这也只适用于有理数。

+0

通过首先进行分子分析,您可以根据类型打开算术溢出的大门;通过首先划分,你又回到了无限小数问题。 –

+0

是的,这真的是一个非常微不足道的问题 – smitec

+0

@AustinSalonen:虽然这是真的,但最终可能会算上溢出,这很容易通过在更大的位空间中进行算术来解决。通过接受'int'作为输入,返回'int',但在内部使用'long',你应该避免绝大多数问题。 – Guvante

0

许多应用程序通过进行中间计算来执行伪分式数学,其精度比最终需要/输出给用户的要高(Office是这样做的)。如果这不是你想要的,并且你想要执行真正的分数学,那么搜索一下Fractions实现。似乎有一个体面的执行here。这种实现的问题是,责任在功能上是正确的,而不是高效的。因此,如果您的应用程序需要使用分数执行数百万次操作,则其性能可能会受到影响。