【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로 처리합니다. 처리 내용으로서는 이런 느낌.
비교로서, 잘 할 것 같은 것으로 다음의 방법으로 써 보았다.
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로 처리합니다. 처리 내용으로서는 이런 느낌.
비교로서, 잘 할 것 같은 것으로 다음의 방법으로 써 보았다.
(int) Math.floor(value)
(int) Math.abs(value)
(int) value
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인) 코드는 재료 이외로는 두 번 다시 쓰지 않을 거라고 생각했습니다.
그럼 노시
Reference
이 문제에 관하여(【Java】 의외로 잊고 있던 소수의 잘림 처리), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/neonemo/items/0e27cccd845630e02edc
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
Reference
이 문제에 관하여(【Java】 의외로 잊고 있던 소수의 잘림 처리), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/neonemo/items/0e27cccd845630e02edc텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)