使用Java学习'数字运算'的最佳资源是什么?我指的是十进制数处理的正确方法,最佳实践,API,性能的显着习惯和常见的陷阱(及其解决方案),同时使用Java编码数字处理。
答案 0 :(得分:1)
这个问题似乎有点开放,可以解释。因此,我只会提供两件简短的事情。
1)十进制精度 - 永远不要假设两个浮点(或双精度)数相等,即使你经历了完全相同的步骤来计算它们。由于在各种情况下四舍五入的许多问题,您通常无法确定十进制数字正是您所期望的。如果你执行double myNumber = calculateMyNumber()
然后做了很多事情,然后回到它并检查if(myNumber == calculateMyNumber()
,即使你没有改变在calculateMyNumber()中完成的计算,该评估也可能是假的
2)您可以跟踪的数字大小和精度有限制。如果您有int myNumber = 2000000000
和if(myNumber*2 < myNumber)
,那么实际上会评估为true,因为myNumber * 2将导致小于myNumber的数字,因为为该数字分配的内存不足以容纳数量很大,它会溢出,变得比以前小。查看封装大数字的类,例如BigInteger和BigDecimal。
如果你研究数字的计算机表示或数字的二进制表示,你会把这样的东西视为副作用。
答案 1 :(得分:1)
首先,您应该了解浮点数学。这不是特定于java,但它允许您稍后做出明智的决定,例如,何时可以使用float
和double
等Java原语。相关主题包括(从a course that I took on scientific computing复制):
这会让您决定是否使用Java的BigDecimal
,BigInteger
等。已经有很多关于此问题的questions和answers。
接下来,您将获得性能,包括CPU和内存。你可能会发现各种经验法则,例如“很多自动装箱是一个严重的性能问题”。但与往常一样,最好的办法是分析您自己的应用程序。例如,假设有人坚持认为某些优化很重要,即使它会影响易读性。如果优化对您的应用程序无关紧要,那就不要这样做了!
最后,在可能的情况下,使用库来获取数字通常是值得的。您的第一次尝试可能比现有的库更慢,更多。例如,为了善良,请不要实现自己的线性编程例程。