Javaで数値の桁数を求める(Javaの除算の丸め込みでハマる)

講師の方に自分で調べて分からないことをいろいろ聞いたら怒られ、若干モチベーションが下がっている今日この頃です。

数値を文字列に変換して、その長さを求める方法は知ってましたが、基数(10進法なので10)で除算していく方法も有名とのこと。

文字列変換バージョン

package digits;

public class Digits {

	public static void main(String[] args) {
		// キーボードからの入力値
		int num = new Scanner(System.in).nextInt();
		// 桁数
		int digits = 0;
		// 文字列変換 
		String number = "" + num;
		// String number = Integer.toString(num);
		digits = number.length();

		System.out.println(digits);

	}

}

10で除算バージョン

package digits;

import java.util.Scanner;

public class Digits {

	public static void main(String[] args) {
		// キーボードからの入力値
		int num = new Scanner(System.in).nextInt();
		// 桁数
		int digits = 0;

		while(num > 0) {
			num /= 10;
			digits++;
		}
		System.out.println(digits);
	}

}

言語によって変わってくるみたいですね。

10で割る方法」と同じようによく使われるのは、「文字列に変換する方法」だ。ただし、Java の場合は文字列変換は負荷が高いので、実行速度は遅くなる。しかし、Ruby をはじめ、PHPPerl のようなスクリプト言語は文字列変換のスピードは非常に速いので、むしろ「10で割る方法」の方が遅いらしい。

【Java】数値の桁数を調べる(べき乗の桁数・べき乗のべき乗の桁を調べる) - ヽ|∵|ゝ(Fantom) の 開発blog?

で、自分は、 num = 9 のときに、9 / 10 = 0.9 だから条件判定で 0より大きいから、次も処理されて、0.09....以下エンドレスで処理が続いちゃうんじゃん?と思っていたのですが、Javaでは除算の丸め込みというものが存在するみたいです。 

整数の除算は、演算結果をゼロに向かって丸める。例えば、99を10で割れば、演算結果は9になる。つまり、9.9の小数点以下が切り捨てられる。マイナスの場合も同じだ。-99を10で割れば、-9になる。ゼロに近づく方向に切り捨てられる。これをゼロに向かって丸めるという。特に、乗算と組み合わせて演算を行うような場合は、注意が必要だ。

【Java入門】割り算と剰余算の基本的な使い方と必須の注意点 

要するに、int型では小数点以下は問答無用で切り捨てられるため、

0.1、0.2、0.3、0.4、0.5、0.6、0.7、0.8、0.9 といった 1より小さい整数はすべてが 0 になるということみたいですね。