我想分割两个ull变量并获得最准确的结果。 最好的方法是什么?
即。 5000034/5000000 = 1.0000068
答案 0 :(得分:5)
如果你想要“最准确的精度” - 你应该避免浮点算术。
你可能想要使用一些大的十进制库[whcih通常实现fixed point算术],并允许你定义你正在寻求的精度。
你应该避免浮点运算,因为它不是精确的[你有有限的位数来表示每个范围内的无限数量的数字,因此必须进行一些切片......]。定点运算[通常在大十进制库中实现]允许您“动态”分配更多位以表示所需精度的数字。 有关浮点问题的更多信息可以在[有点高级]文章中找到:What Every Computer Scientist Should Know About Floating-Point Arithmetic
答案 1 :(得分:1)
代替(双)(N)/ D,做1 +((双)(N - D)/ D)
答案 2 :(得分:0)
我担心“最准确的结果”并不意味着
许多。没有有限的表示可以准确地表示所有实数;
表示的精确程度取决于类型的大小
及其内部代表。在大多数实现中,double
将会
给出大约17个十进制数字的精度,通常是几个数量级
比输入更精确;对于单个乘法或除法,
double
通常很好。 (加法和减法出现问题
当两个值之间的差异极端时。)存在
提供更高精度的包(BigDecimal
,BigFloat
和
喜欢),但它们永远不会精确:最终,精度受到限制
你愿意让他们使用的记忆量。他们也很多
慢于double
,并且通常(稍微)更难以使用
正确(因为他们有更多的选择,例如,多少精度
你要)。您问题唯一真正的答案是另一个问题:
你需要多少精度?对于什么样的操作顺序?
舍入错误会累积,因此double
可能足够大
对于单个部门,如果天真地使用它可能会导致问题
迭代程序。虽然在这种情况下,解决方案不是
通常是为了提高精度,但要以某种方式改变算法
避免这些问题。如果double
为您提供所需的精确度,
使用它优先于任何扩展类型。如果没有,你就不这样做
有一个选择,然后选择一个现有的任意精度
库,例如GMP。
(处理舍入的方式可能也有问题 以簿记为目的,例如,大多数司法管辖区都非常严格 关于如何围绕单一价值观的法律及其规则是基于的 十进制算术。在这种情况下,您需要一个数字类型 进行十进制算术以使舍入符合所有 的情况。)
答案 3 :(得分:0)
浮点数可能对乘法和除法最准确,而整数和不动点数是加法和减法的最佳选择。这是因为乘法和除法改变了浮点数处理得更好的数量级,而加法和减法是某种步骤,整数和定点数处理得更好。
如果想要在分割整数时获得最佳精度,请实现包含分子和分母的RationalNumber类。这样,如果避免算术溢出,您的reslut将始终是精确的。这要求您以分数形式接受输出。