【问题标题】:Map an Integer to a percentage [0,100]将整数映射到百分比 [0,100]
【发布时间】:2018-07-08 12:33:34
【问题描述】:

我正在尝试映射[0.0, 100.0] 范围内的所有Integers。

我知道公式是:

((input - min) * 100) / (max - min)

您可以想象,如果您想映射整个Integer 域,您将不得不使用Integer.MIN_VALUEInteger.MAX_VALUE

double percentage = ((double) input - Integer.MIN_VALUE) * 100 / (Integer.MAX_VALUE - Integer.MIN_VALUE);

这里的问题是Integer.MAX_VALUE - Integer.MIN_VALUE会溢出到-1

我想出的解决方案是在进行任何操作之前将每个Integer 转换为double

double percentage = ((double) input - (double) Integer.MIN_VALUE) * 100.0 / ((double) Integer.MAX_VALUE - (double) Integer.MIN_VALUE);

double 的部分演员表可以省略,但为了清楚起见,我将全部保留。

有没有更好更简洁的方法来做这个映射?

【问题讨论】:

    标签: java casting int double percentage


    【解决方案1】:

    第一件事:如果没有强制转换,你就无法做到这一点,否则你会得到整数除法,你可能不会想要,即使不是这样极端的情况。因此,在常规情况下,为了正确性,强制转换是不可避免的。在这种情况下,这种需要是由溢出强制执行的,但仅溢出并不能证明使用浮点是合理的。如果溢出是唯一的问题,Long 可能是一个选项。

    第二:每个表达式只转换公式中的一个元素就足够了,其他元素将被转换以执行此操作。

    示例: 这是多余的

    (double) input - (double) Integer.MIN_VALUE

    和这个一样

    (double) input - Integer.MIN_VALUE
    

    因此,只需删除您拥有的冗余

    ((double) input - Integer.MIN_VALUE) * 100 / ((double) Integer.MAX_VALUE - Integer.MIN_VALUE)
    

    如果你喜欢它简短并且代码简单,你可以静态导入(不过这更多的是见仁见智)

    import static java.lang.Integer.MIN_VALUE;
    import static java.lang.Integer.MAX_VALUE;
    

    这会将公式的同一行转换为:

    ((double) input - MIN_VALUE) * 100 / ((double) MAX_VALUE - MIN_VALUE)
    

    您也可以将以下变量视为最终变量:

    最终 Double PERCENTAGE_COEF = 100 / ((double) MAX_VALUE - MIN_VALUE);

    最终双 RANGE_SIZE = (double) MAX_VALUE - MIN_VALUE;

    你终于可以拥有了

    delta * PERCENTAGE_COEF
    

    例如,如果这是用于可重复使用的,你可以选择一个比我更好的名字,你会有这样的:

    final static Double PERCENTAGE_COEF = 100 / ((double) MAX_VALUE - MIN_VALUE);
    
    public Double apply( Double input) {
        double delta = input - MIN_VALUE;
        return delta * PERCENTAGE_COEF ;
    }
    

    不过,所有这些变化都是个人喜好问题。出于性能考虑,您的编译器可能无论如何都会猜测常量。

    【讨论】:

    • 你需要强制转换是因为溢出,而不是因为整数除法。这里的跨部门并没有什么问题。
    • 我说你需要选角。是的,如果由于这两个原因。尝试在这种极端情况下使用这个公式......
    • 或者只是尝试使用 longs
    【解决方案2】:

    更清洁的方式:

    Double input = 12d;
    Double min = Double.valueOf(Integer.MIN_VALUE);
    Double max = Double.valueOf(Integer.MAX_VALUE);
    
    Double percentage = (input - min)*100.0/(max-min);
    

    【讨论】:

      【解决方案3】:

      嗯,允许您使用第一个公式并在整数域中进行减法的最简单方法是将输入转换为 long,它有足够的位来准确表示减法的结果。不过,我不确定我是否会认为“更清洁”。在实践中,将输入转换为 double 可能是最不令人惊讶且最实用的方法。

      【讨论】:

        猜你喜欢
        • 2021-02-21
        • 1970-01-01
        • 2011-11-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-05-05
        • 2011-05-31
        • 2020-12-17
        相关资源
        最近更新 更多