2015-09-11 1 views
3

Я думал, что я мог бы сделать это легко с чем-то, такими, как:Как проверить, имеет ли двойная переменная более двух десятичных знаков в Java?

double numInput; 

numInput = Double.parseDouble(inputTxtField.getText()); 

if ((numInput * 100) % 1 != 0) { 

// do something 

} 

Тем не менее, я получаю всякие странные тестовых где такие, как:

ложь: 2,11, 2,5, 2,6

верно: 2,22, 2,3, 2,2

Я только начал программировать, поэтому, возможно, это глупая дура, но я подумал о том, чтобы умножить двойную на 100, а затем проверить остаток, когда деление на 1 будет работать. Цель состоит в том, чтобы запретить кому-либо вводить число с более чем двумя десятичными знаками. Меньше или равно 2 десятичным знакам.

Любые советы приветствуются! Спасибо!

EDIT: Благодарим вас за все быстрые комментарии! Это решило мою проблему, и я очень ценю дополнительную информацию о том, почему это не сработает. Спасибо!

+0

Я не очень хорошо понимаю проблему, и, прежде всего, поставить полный код –

+0

Получить индекс «» и минус, что из длины двойной heh –

+1

[Является ли математика с плавающей запятой?] (http://stackoverflow.com/questions/588004/is-floating-point-math-broken) – Dukeling

ответ

3

Попробуйте

if(inputTxtField.getText().indexOf(".") >= 0 && inputTxtField.getText().indexOf(".") < inputTxtField.getText().length() - 2){ 

Это будет true, когда есть десятичное в оригинальном String, который до последних 2-х символов в String.

+0

Это не удается, если пользователь вводит '123.4500', хотя это число технически хорошо. – Andreas

+1

@Andreas: Вопрос состоял в проверке наличия двух десятичных знаков, что неверно для этого ввода, даже если они являются нулями.Даже если ваш ввод действителен, его можно решить с помощью таких вещей, как создание регулярного выражения, которое позволяет любое количество нулей в конце. Во всяком случае, общая идея проверки входного текста намного более разумна, чем преобразование его в двойное, а затем попытка рассуждать об этом +1. –

+0

@NathanHughes Вопрос: «double ** variable ** имеет более двух десятичных знаков». Вопрос не в том, как проверить текстовое поле, даже если это источник значения. Теперь хороший ответ может предположить, что * в качестве альтернативы *, но этот ответ отклонился от вопроса без предупреждения. – Andreas

4

Преобразовать в BigDecimal и проверить scale:

double[] values = { 2.11, 2.5, 2.6, 2.22, 2.3, 2.2, 3.141 }; 
for (double value : values) { 
    boolean fail = (BigDecimal.valueOf(value).scale() > 2); 
    System.out.println(value + " " + (fail ? "Fail" : "Pass")); 
} 

Выход

2.11 Pass 
2.5 Pass 
2.6 Pass 
2.22 Pass 
2.3 Pass 
2.2 Pass 
3.141 Fail 
3

Это не будет работать. Компьютеры работают в двоичном формате. Помните, что 1/3 равно 0,333333333 с бесконечными цифрами. Компьютер может хранить только конечное число двоичных цифр, поэтому он сокращается после некоторых цифр. Это означает, что 1/3 * 3! = 1. То же самое относится к любому числу в двоичном формате, то есть 1/100 * 100 не 1, потому что вы просто потеряли несколько знаков после запятой. Работая с двойным, вы никогда не сможете использовать стандартные = или! = Операторы, потому что они не будут работать большую часть времени.

Лучший способ решить это в вашем случае - напрямую работать со строкой и посмотреть на позицию «.». персонаж.

0

Попробуйте использовать compareTo из Double класса

Double numInput; 
Double foo = numInput*100; 
foo = foo - foo.intValue(); 

if (foo.compareTo(0D) > 0) { 

    //has more than two digits 

} 
Смежные вопросы