【Java】 의외로 잊고 있던 소수의 잘림 처리

14070 단어 자바

0. INDEX


  • 개요
  • 의외로 잊어버린 소수 자르기 처리
  • 후기

  • 1. 개요



    문득, 그러고 보면 부의 값의 잘라내는 것은 어땠을까 생각하고 검증해 보았습니다.

    2. 의외로 잊어버린 소수의 잘림 처리



    2.1. 우선은 JIS 규격에 맞춰 본다



    잘라내기의 규격은 발견되지 않았기 때문에, 그것에 가까운 수치의 반올림 방법(JISZ8401 : 수치의 반올림 방법)에 의하면, 정수에 반올림한 경우(사사오입으로 한다)는 이런 느낌이 되는 모양.
    뭐, 절대치로 ​​처리를 한다고 말하면 알기 쉬운가.

    경제산업성 산업표준조사실(JIS검색도구 : 필수계정)
    htps //w w. Sc. . jp / 아 p / 지 s / 게네라 l / G r r 쏘세 아 rch. HTML


    투입값
    반올림 후
    비고


    100
    100
    -

    100.12
    100
    -

    100.56
    101
    긍정적인 방향으로 올라가다

    0
    0
    -

    -100
    -100
    -

    -100.12
    -100
    -

    -100.56
    -101
    음의 방향으로 증가


    같은 김으로 잘라내어 처리한다면 이렇게 될까


    투입값
    절단 후
    비고


    100
    100
    -

    100.12
    100
    0에 가까워지도록 줄이기

    100.56
    100
    0에 가까워지도록 줄이기

    0
    0
    -

    -100
    -100
    -

    -100.12
    -100
    0에 가까워지도록 증가

    -100.56
    -100
    0에 가까워지도록 증가


    즉 이런 일입니까.



    2.2. Java에 의한 절단 처리



    위의 샘플을 Java로 처리합니다. 처리 내용으로서는 이런 느낌.
    비교로서, 잘 할 것 같은 것으로 다음의 방법으로 써 보았다.
  • floor/(int) Math.floor(value)
  • abs/(int) Math.abs(value)
  • cast/(int) value
  • format/String.format("%.0f", value)
  • 뇌근/String.format("%.0f", value - 0.5)

  • 동작 샘플



    출처


    public class Main {
        public static void main(String[] args) {
    
            StringBuilder result = new StringBuilder(String.format("%11s\t%12s %8s %8s %8s %8s %" + calcFormatLength(8, "脳筋") + "s\n", "-", "orignal", "floor", "abs", "cast", "format", "脳筋"));
    
            // 正の整数
            result.append(getFormatedString("正の整数", 100));
    
            // 正の値、四捨五入で切り捨てる範囲
            result.append(getFormatedString("正の小数", 100.12));
    
            // 正の値、四捨五入で繰り上げる範囲
            result.append(getFormatedString("+繰上げあり", 100.56));
    
            // ゼロ
            result.append(getFormatedString("ゼロ", 0));
    
            /**
             * 負数の四捨五入の規格について(JIS規格番号 : Z8401)
             * @see https://www.jisc.go.jp/app/jis/general/GnrJISSearch.html
             */
            // 負の整数
            result.append(getFormatedString("負の整数", -100));
    
            // 負の値、四捨五入で切り捨てる範囲
            result.append(getFormatedString("負の小数", -100.12));
    
            // 負の値、四捨五入で繰り上げる範囲
            result.append(getFormatedString("+繰上げあり", -100.56));
    
            // 結果出力
            System.out.println(result);
        }
    
        private static String getFormatedString(String subject, double value) {
    
            String floorValue = String.format("%d", (int) Math.floor(value));
            String absValue = String.format("%d", (int) Math.abs(value) * (value < 0 ? -1 : 1));
            String castValue = String.format("%d", (int) value);
            String formatStr = String.format("%.0f", value);
            String hotHeaded = String.format("%.0f", value - 0.5);
    
            StringBuilder formatString = new StringBuilder()
                .append("%").append(calcFormatLength(12, subject)).append("s\t")
                .append("%12s %8s %8s %8s %8s %8s\n");
    
            return String.format(formatString.toString(), subject, value, floorValue, absValue, castValue, formatStr, hotHeaded);
        }
    
        /**
         * String.format()で使えるように全角文字の文字数を再計算して返す
         * @param strLength 元々設定したい桁数
         * @return 指定した文字列に合うように調整した桁数(1バイト文字以外は2換算にする)
         */
        private static int calcFormatLength(int strLength, String str) {
            int digitLength = strLength;
            for (int i = 0; i < str.length(); i++) {
                if (String.valueOf(str.charAt(i)).getBytes().length != 1) {
                    digitLength--;
                }
            }
            return digitLength;
        }
    }
    

    실행 결과


             -     orignal    floor      abs     cast   format     脳筋
       正の整数       100.0      100      100      100      100      100
       正の小数      100.12      100      100      100      100      100
    +繰上げあり      100.56      100      100      100      101      100
           ゼロ         0.0        0        0        0        0       -1
       負の整数      -100.0     -100     -100     -100     -100     -101
       負の小数     -100.12     -101     -100     -100     -100     -101
    +繰上げあり     -100.56     -101     -100     -100     -101     -101
    

    그래서 JIS 규격에 가까운 자르기 방법이라고 정수 처리에 한해서는 단순히 캐스트를 사용하는 것이 좋을 것이라고 알았다.
    JavaDoc에도 있습니다만, 부수이어도 floor는 어디까지나 둥글게 하는 방향이 부의 방향이라고 하는 것이 특징적이며, 함정도 될 수 있습니다. ( 1.1 이하의 최대 정수는 1 하지만 -1.1 이하의 최대 정수는 -2 네요!)

    클래스 Math - floor

    그렇다고는 해도, 둥근 방법은 정말로 안건 단위로 바뀔 것 같은 기색은 하므로, 매번 확인하면서 진행하는 것이 좋을 것이라고는 생각한다.
    소수 제 몇위에서 잘라내고 싶은 처리의 경우는, 10의 몇승을 곱하고 나서 처리를 해…적인 것이 필요할 것이다.
    (무언가 함수 그럴까? 조사하지 않았지만)

    3. 후기



    이번은, 비교적 당전 지나 자신의 사고가 뇌사 상태였던 잘라내기 처리에 대해서 다시 검증해 보았다고 하는 것으로, 파내면 의외로 함정이 있는 것을 재확인했습니다라는 기사였습니다.
    안건에서는 부수를 취급하는 것이 별로 없어(있어도 한층 더 연산해 어떻게 이런 것은 드물다), 잊고 있었으므로 좋았습니다.

    우선, 뇌근(Hot-Headed인) 코드는 재료 이외로는 두 번 다시 쓰지 않을 거라고 생각했습니다.

    그럼 노시

    좋은 웹페이지 즐겨찾기