2013-03-01 7 views
-2

Я пытаюсь преобразовать String в Double в Java. Я получаю следующую строку от клиента «1131.00», но когда я конвертирую ее в Double, я возвращаюсь назад 1131.0, что НЕ является правильным. Я ожидаю 1131.00 (.00 - с двумя нулями)Java - String to Double Issue

_dPaymentAmt = ConvertUtil.stringToDouble(sPaymentAmt, 0.0); 

public static double stringToDouble(String str, double dDefaultValue) 
     throws Exception 
     { 
     double doubleValue = 0; 

     try 
      { 
      doubleValue = Double.parseDouble(str); 
      } 
     catch (Exception e) 
      { 
      doubleValue = dDefaultValue; 
      } 

     return doubleValue; 
     } 

Как я могу поддерживать два ноль после десятичной?

EDIT: Один из промежуточных слоев удаляет десятичный период, чтобы отправить значение в банк, и банк делит его на 100 для вычисления десятичных знаков. Поэтому, если я пришлю 1311.0, банковские сборы 131.10 ... поэтому я должен поддерживать две десятичные точки, сохраняя их как ДВОЙНОЕ значение.

+5

Хм, сохраните его как 'String'? –

+0

И, может быть, использовать 'DecimalFormat'? – squiguy

+0

Что вы подразумеваете под «Я возвращаюсь»? Вы переводите его обратно в 'String'? –

ответ

11

double не содержит незначительных десятичных цифр. Это просто величина - так 1131 == 1131.0 == 1131.00. Это является правильно конвертировать "1131.00" в 1131.0. Возможно, это не то, что вы хотите, но это правильно.

Если вы на самом деле пытаетесь сохранить значение, которое всегда имеет две десятичные цифры (например, валюту), вы, вероятно, не должны использовать double для начала. Используйте либо BigDecimal, либо сохраните целое число центов (или любой другой тип данных, который вы храните).

Пример показывает BigDecimal работы:

import java.math.*; 

public class Test {  

    public static void main (String[] args) throws Exception { 
     BigDecimal bd = new BigDecimal("1311.00"); 
     System.out.println(bd); // 1311.00 
    } 
} 

Обратите внимание, что это почти всегда неприемлемая для хранения валютных ценностей в качестве double (или какого-либо плавающого двоичного номера точки).

Если вышеуказанное не соответствует вашим требованиям, пожалуйста, укажите больше условий.

+4

@Alex Любое ** двоичное ** представление с плавающей запятой несовместимо с сохранением числа ** десятичных цифр ** после ** десятичной точки **. Почему вы вообще хотите использовать double? Может быть, если бы мы знали, что можем придумать решение. –

+0

@Alex: ** Почему ** вы настаиваете на том, чтобы держать его как двойник? Как вы отправляете стоимость в банк? (Я сильно подозреваю, что вы злоупотребляете интерфейсом - я сомневаюсь, что банк был бы сломан.) Как я уже сказал, сохраните его как «BigDecimal» или сохраните его как целое число (значение * 100) и отформатируйте его вручную. –

+0

Я понимаю это, и имеет смысл, что Double имеет только 1 ноль, но когда я перехватил интерфейс банка, я отправляю его как Double.toString (double amount) внутри XML ... Я предполагаю, что здесь я должен убедиться, что у меня есть два нули после десятичной дроби. – Alex

5

double не делает различий между 1131.0 и 1131.00: при хранении в переменной double они являются точно таким же числом.

Возможно, вы хотите оставить цифры Strings или использовать BigDecimal.

0

Ваше ожидание сохранения двух знаков после запятой в double Тип данных не имеет смысла. Что касается численного значения, то 1131.0 и 1131.00 - это одно и то же, поэтому двойной тип данных будет поддерживать значение 1131.0.

Просто сохраните его как строку, если вам нужно сохранить десятичные знаки.

1

Это все форматирование. Двойной объект НЕ содержит ЛЮБОЙ ссылки на количество нулей ... Это все так, как вы его печатаете. В математике, 1311.00 точно так же, как 1311, так что это не заботится об этих нулях. Вы должны отформатировать его правильно, если хотите сохранить нули.

2

С помощью java.math.BigDecimal:

String dblStr = "1131.00"; 
BigDecimal bd = new BigDecimal(dblStr); 
System.out.println("BD is " + bd); 
0

Его так просто, как следующий фрагмент кода:

public void GetTwoDecimal(){ 

      double d = 2.34568; 
      DecimalFormat f = new DecimalFormat("##.00"); // this will helps you to always keeps in two decimal places 
      System.out.println(f.format(d)); 
    } 

Source

+0

Вам нужно использовать '0' не '#', из javadoc: "# Digit, zero show as absent" –

-1

Создать формат (например, format.money ("$ 0,00")). Java, вероятно, имеет встроенный формат для работы с деньгами. Используйте формат денег, если хотите две десятичные знаки.

0

попробуйте вот так: я уверен, что ваша проблема будет решена.

import java.text.*; 
public class Demo 
{ 
    public static void main(String args[]) 
    { 
    String str = "131.0000"; // keep as many zeroes 
    double d1 = Double.parseDouble(str); 
    DecimalFormat df = new DecimalFormat("0.00"); 
    System.out.print(df.format(d1)); 
    } 
}