假设这些都是你总是使用这种计算的值,那么我会做这样的事情:
D = I/(65535/C);
或
D = I/4369;
由于C为65535的一个因素。这将有助于减少超出可用整数范围的可能性(即,如果您只有16位未签名的整数)。
在更一般的情况下,如果您认为存在I和C的乘法会导致您使用的整数类型的允许范围之外的值的风险(即使最终结果将在里面该范围内),您可以分解出的分子和分母GCD为:
INT I = 41828;
INT C = 15;
INT DEN = 65535;
INT GCDI = GCD(I, DEN);
DEN = DEN/GCDI;
I = I/GCDI;
INT GCDC = GCD(C, DEN);
DEN = DEN/GCDC;
C = C/GCDC;
INT D = (I * C)/DEN;
哪里DEN是你的分母(65535在这种情况下)。在所有情况下,这不会为您提供正确的答案,特别是如果I和C都与DEN和I * C> MAX_INT互为素数。
对于您提出的较大问题,整数值的除法将始终会丢失小数部分(相当于floor函数)。保留我们认为是“十进制”部分的信息的唯一方法是通过可以从模数导出的余数。我强烈建议你不要混用这些不同号码系统的含义。整数只是整数。如果你需要它们是浮点数,你应该真的使用浮点数,而不是整数。如果所有你感兴趣的是向用户显示小数部分(即你没有真正使用它进行进一步计算),那么你可以编写一个例程来将余数转换为表示余数的字符串。
对不起,我不明白。什么是MOD? – John 2010-04-02 21:56:05
MOD返回余数。所以,说我有6/4 DIV会返回1,而MOD会返回2.我需要在上面编辑我的答案...... 638对于MOD来说是不正确的。 :)刚才看到了。 http://en.wikipedia.org/wiki/Modulo_operation – 2010-04-02 22:00:12