【发布时间】:2012-01-31 04:12:58
【问题描述】:
在我的平台上,unsigned long long 是 64 位(8 字节)。假设我有两个这样的变量:
unsigned long long partialSize;
unsigned long long totalSize;
//somehow determine partialSize and totalSize
如何可靠地确定partialSize 与totalSize 的百分比(四舍五入到附近的整数)? (如果可能的话,如果我不必假设前者小于后者,那就太好了,但如果我真的必须做出这个假设,那很好。但我们当然可以假设两者都不-负数。)
例如,以下代码是否完全防弹?我担心它包含某种舍入、强制转换或转换错误,可能会导致比率在某些情况下不正常。
unsigned long long ratioPercentage
= (unsigned long long)( ((double)partialSize)/((double)totalSize) * 100.0 );
【问题讨论】:
-
您说得对,在非常极端的情况下,直接的方法可能会“失控”。这是因为有两个级别的舍入以及 64 位 -> 53 位的精度损失。
-
@Mysticial。结果最多只需要 7 位精度。我会说 64 → 53 根本不是问题。
-
您可能感兴趣的两个链接:1) kanooth.com/numbers 2) en.wikipedia.org/wiki/Arbitrary-precision_arithmetic
-
@Mysticial:OP 的公式不正确,因为它总是向 0 截断,而不是四舍五入。
int((100 * 2751734980444983885.0) / 10006309019799941400.0 + 0.5)在 Python 中给了我 28。我同意,尽管在极少数情况下 64 位结果给出 0.49999... 而 53 位结果给出 0.5000... -
@KennyTM 我删除了我的最后一条评论,因为这是一个不好的例子。这是一个更好的:
850536266682995018 / 3335436339933313800即使使用+0.5,这个也失败了。正确答案是25%,正确的公式是26%。但是,是的,我们是一致的。
标签: c 64-bit int computer-science