Як зробити Integer.parseInt () для десяткового числа?


76

Код Java такий:

String s = "0.01";
int i = Integer.parseInt(s);

Однак це викидання NumberFormatException ... Що може піти не так?

Відповіді:


66

0,01 не є цілим числом (цілим числом), тому ви, звичайно, не можете проаналізувати його як одне. Використовуйте Double.parseDoubleабо Float.parseFloatзамість цього.


96
String s = "0.01";
double d = Double.parseDouble(s);
int i = (int) d;

Причиною винятку є те, що ціле число не містить раціональних чисел (= в основному дроби). Отже, намагатися проаналізувати 0.3int - це нісенітниця. A doubleабо floatтип даних може містити раціональні числа.

Шлях Java кидає doubleАнь intздійснюється видалення частини після десяткового роздільника округлення до нуля .

int i = (int) 0.9999;

i буде нульовим.


2
Акторський склад повністю втратить дробову інформацію. Я не впевнений, що це хороша ідея порадити.
Йорен

1
Гаразд! можливо, мені доведеться зробити щось подібне Double d = Double.parseDouble (s); так?
Кевін Бойд,

1
@Kevin: так, але ви можете використовувати також "double" замість "Double"
Martijn Courteaux

1
Він каже, що хоче ціле число, але чи впевнені ми, що саме це йому потрібно ?
Йорен



9

Цей тип перетворення насправді незвично неінтуїтивний у Java

Візьмемо для прикладу такий рядок: "100,00"

C: проста стандартна функція бібліотеки принаймні з 1971 р. ( Звідки пішла назва `atoi`? )

int i = atoi(decimalstring);

Java: обов’язковий прохід шляхом синтаксичного аналізу Double (або Float), за яким слідує кидок

int i = (int)Double.parseDouble(decimalstring);

Напевно, у Java є деякі дивацтва


C просто ігнорує решту рядка та аналізує все, що він може проаналізувати (у цьому випадку це так 100). Ви не можете дізнатись, чи atoiпроаналізовано насправді все у рядку чи ні, чи містить рядок число чи число переповнює тип. strtolє кращою альтернативою, де можна виявити все вищезазначене. Java є жорсткішою, але вона гарантує, що всі ці випадки охоплені.
nhahtdh

Я погоджуюсь з Рейвеллом, тому що це працює. Double.valueOf("16543").intValue();Отже, Java хоче бути PITA, коли ви хочете швидко перетворити на int, але Double є набагато загальнішим.
Хтось десь

4

Використання BigDecimal для отримання округлення:

String s1="0.01";
int i1 = new BigDecimal(s1).setScale(0, RoundingMode.HALF_UP).intValueExact();

String s2="0.5";
int i2 = new BigDecimal(s2).setScale(0, RoundingMode.HALF_UP).intValueExact();

3

припустимо, ми беремо ціле число в рядку.

Рядок s = "100"; int i = Integer.parseInt (s); або int i = Integer.valueOf (s);

але у вашому питанні число, яке ви намагаєтесь змінити, це ціле число

Рядок s = "10.00";

double d = Double.parseDouble (s);

int i = (int) d;

Таким чином ви отримуєте відповідь на значення, яке ви намагаєтесь отримати.



2

Використовуйте Double.parseDouble(String a)те, що шукаєте, не ціле число, оскільки це не ціле число.


0

Можливо ще одне рішення.

int number = Integer.parseInt(new DecimalFormat("#").format(decimalNumber))  

Приклад:

Integer.parseInt(new DecimalFormat("#").format(Double.parseDouble("010.021")))  

Вихідні дані

10
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.