【问题标题】:How to approximate double?如何近似双倍?
【发布时间】:2011-03-02 04:25:13
【问题描述】:

我如何编写一个以以下方式逼近 double 的函数,并返回一个 int:

function (2.3) -> 2
function (2.7) -> 3
function (-1.2) -> -1
function (-1.7) -> -2

【问题讨论】:

    标签: java math


    【解决方案1】:

    怎么样:

    Math.round
    

    将 double 转换为 int 可能会出现溢出问题 - 因此实际上返回 long。

    【讨论】:

    • 不要迂腐,但问题不是溢出。从 double 转换为 int 或 long 只返回最接近的值;如果双精度真的很大,它将是 Integer.MAX_VALUE 或 Long.MAX_VALUE。他们使用 long 只是为了更精确并减少机会。
    【解决方案2】:

    我从未使用过 Java,但我 100% 确定有一个 Round 或 Math.Round 函数可用于此!

    【讨论】:

      【解决方案3】:

      这是作业吗? 因为有一个库函数可以做到这一点:Math.round()

      如果您实际上是在尝试自己实现与此类似的东西,一种方法是采用双精度并将其显式转换为 int。

      对于正数,这实际上会截断它(例如,5.99 变为 5.00)。

      现在您可以将其转换回双倍,并从您的原始数字中扣除。这会让你得到一个介于 0 和 0.99 之间的数字......

      将其与 0.50 进行比较,然后决定是向上取整还是向下取整。如果向下取整,取截断的数字,否则取截断的 + 1。

      【讨论】:

      • 执行此操作的标准方法是truncate(x + .5)。如果原始数字的小数部分
      • @jamessan:但这需要访问截断,我猜 OP 没有,因为他也无法舍入。但通常这会节省一步,这是真的。
      • 是的,它应该,我把它复杂化了,正如我在给 jamessan 的回复中所说的那样。
      • System.out.println((int)(-1.7 + 0.5)) 打印的是 -1,而不是 -2
      • @MarkPeters:对,你必须知道x 的符号并相应地进行调整,就像Uri 在他的帖子中提到的那样——For the case of positive numbers, ...
      【解决方案4】:

      您可以为此使用Math.round 方法,请参阅https://docs.oracle.com/javase/1.5.0/docs/api/java/lang/Math.html

      【讨论】:

        【解决方案5】:
        public int homeworkFunction(double x) {
         return (int)(Math.signum(x) * Math.min(Math.round(Math.abs(x)) , Integer.MAX_VALUE);
        }
        

        【讨论】:

        • 仍然没有按要求做。使用 Math.round 代替 Math.floor 就可以了。
        • 是的,您是对的,没有仔细查看示例数据。
        【解决方案6】:

        没有 Math.round(),你可以使用

        public long homeworkFunction(double x) {  
            return (long)(x > 0 ? x + 0.5 : x - 0.5));
        }
        

        【讨论】:

          【解决方案7】:

          小菜一碟,伙计:

          private double round(double d, int numbersAfterDecimalPoint) {
              long n = Math.pow(10, numbersAfterDecimalPoint);
              double d2 = d * n;
              long l = (long) d2;
              return ((double) l) / n;
          }
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2014-03-02
            • 1970-01-01
            • 2014-02-28
            • 1970-01-01
            • 2011-01-10
            • 2013-03-30
            • 2012-10-31
            • 1970-01-01
            相关资源
            最近更新 更多