12345.6789
(動的である必要があります)の2倍の値があるとします
ここで、要件は数値を分割し、10進数と小数桁を取得します。これは次のようになります。
double number = 12345.6789;
int decimal = 12345;
int fractional = 6789;
小数部はうまくいきますが、小数部のヒントを教えてください。どうもありがとう。
12345.6789
(動的である必要があります)の2倍の値があるとします
ここで、要件は数値を分割し、10進数と小数桁を取得します。これは次のようになります。
double number = 12345.6789;
int decimal = 12345;
int fractional = 6789;
小数部はうまくいきますが、小数部のヒントを教えてください。どうもありがとう。
double number = 12345.6789; // you have this
int decimal = (int) number; // you have 12345
double fractional = number - decimal // you have 0.6789
ここでの問題は、小数部分が「0.6789」としてメモリに書き込まれないことですが、いわば特定の「オフセット」がある可能性があります。たとえば、0.6789
として保存できます0.67889999291293929991
。
ここでのあなたの主な関心事は、小数部分を取得することではなく、特定の精度で小数部分を取得することだと思います。
割り当てた正確な値を取得したい場合は、これを検討することをお勧めします(また、これはクリーンなソリューションではありません)。
String doubleAsText = "12345.6789";
double number = Double.parseDouble(doubleAsText);
int decimal = Integer.parseInt(doubleAsText.split("\.")[0]);
int fractional = Integer.parseInt(doubleAsText.split("\.")[1]);
しかし、私が言ったように、これは最も効率的でクリーンなソリューションではありません。
やりたいことを正確に行うことはできません。
1つの問題は、あなたが数を持っている場合1.05
、結果はどうあるべきかということです。
double number = 1.05;
int decimal = 1;
int fractional = 5; // Oops! "1.05" and "1.5" give the same result.
これはどう?
int fractional = 05; // Still not correct. This is an octal number.
もう1つの問題は、double型がを正確に表すことができないこと12345.6789
です。代わりに、わずかに異なる番号を格納します。これは表現エラーと呼ばれます。したがって、小数部分は実際にはなりません6789
。代わりに、小数点以下の桁数に四捨五入することができます。
int fractional = (int)Math.round((number - decimal) * 1000);
サポートする小数点以下の桁数を決定する必要があります。私はこの方法を使用します:
int decimals = 2;
BigDecimal value = new BigDecimal(123.45).setScale(decimals, RoundingMode.HALF_EVEN);
BigInteger INTEGER = value.abs().toBigInteger();
//(value - INTEGER) * (10 ^ decimais)
BigInteger DECIMAL = ((value.subtract(new BigDecimal(INTEGER))).multiply(new BigDecimal(10).pow(decimals))).toBigInteger();
に変換しString
、小数点を見つけ、部分文字列を取得してから、整数に戻すことができます。
String numberStr = Double.toString(number);
String fractionalStr = numberStr.substring(numberStr.indexOf('.')+1);
int fractional = Integer.valueOf(fractionalStr);