21

12345.6789(動的である必要があります)の2倍の値があるとします

ここで、要件は数値を分割し、10進数と小数桁を取得します。これは次のようになります。

double number = 12345.6789;
int decimal = 12345;
int fractional = 6789;

小数部はうまくいきますが、小数部のヒントを教えてください。どうもありがとう。

4

4 に答える 4

40
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]);

しかし、私が言ったように、これは最も効率的でクリーンなソリューションではありません。

于 2012-07-15T21:19:39.480 に答える
10

やりたいことを正確に行うことはできません。

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);
于 2012-07-15T21:01:42.587 に答える
3

サポートする小数点以下の桁数を決定する必要があります。私はこの方法を使用します:

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();
于 2013-06-24T03:02:55.877 に答える
1

に変換しString、小数点を見つけ、部分文字列を取得してから、整数に戻すことができます。

String numberStr = Double.toString(number);
String fractionalStr = numberStr.substring(numberStr.indexOf('.')+1);
int fractional = Integer.valueOf(fractionalStr); 
于 2012-07-15T21:18:30.683 に答える