BigDecimal round:doubleValue()vs setScale(2,BigDecimal.ROUND_HALF_UP)的价格值

时间:2016-09-02 08:15:31

标签: java bigdecimal price

我一直在使用@Override protected String doInBackground(String... params) { StringBuilder result = new StringBuilder(); cursorImage = db.rawQuery("select * from FieldTestDataFinal Where isSend ='N'", null); for (cursorImage.moveToFirst(); !cursorImage.isAfterLast(); cursorImage.moveToNext()) { result.append(sendRequest(cursorImage)); } return result.toString(); } private String sendRequest(Cursor cursorImage){ String responseDump = ""; SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);//set soap version envelope.dotNet = true; SoapObject request = new SoapObject(namespacegetlistdata, method_name__image); request.addProperty("fileByte1", cursorImage.getString(cursorImage.getColumnIndex("METER_IMAGE1")));//add the parameters request.addProperty("fileName1", cursorImage.getString(cursorImage.getColumnIndex("fileName1")));//add the parameters request.addProperty("fileByte2", cursorImage.getString(cursorImage.getColumnIndex("METER_IMAGE2")));//add the parameters request.addProperty("fileName2", cursorImage.getString(cursorImage.getColumnIndex("fileName2")));//add the parameters request.addProperty("fileByte3", cursorImage.getString(cursorImage.getColumnIndex("METER_IMAGE3")));//add the parameters request.addProperty("fileName3", cursorImage.getString(cursorImage.getColumnIndex("fileName3")));//add the parameters request.addProperty("fileByte4", cursorImage.getString(cursorImage.getColumnIndex("METER_IMAGE4")));//add the parameters request.addProperty("fileName4", cursorImage.getString(cursorImage.getColumnIndex("fileName4")));//add the parameters request.addProperty("fileByte5", cursorImage.getString(cursorImage.getColumnIndex("METER_IMAGE5")));//add the parameters request.addProperty("fileName5", cursorImage.getString(cursorImage.getColumnIndex("fileName5")));//add the parameters request.addProperty("fileByte6", cursorImage.getString(cursorImage.getColumnIndex("SIGNATURE_CONSUMER")));//add the parameters request.addProperty("fileName6", cursorImage.getString(cursorImage.getColumnIndex("fileName6")));//add the parameters envelope.setOutputSoapObject(request); HttpTransportSE androidHttpTransport = new HttpTransportSE(url_getlistdata); androidHttpTransport.debug = true; try { androidHttpTransport.call(soap_action_uploadImage, envelope); responseDump = transport.responseDump; } catch (Exception e) { e.printStackTrace(); Log.d("myError -", String.valueOf(e)); } return responseDump; } 价格,但我想知道向用户展示此内容的最佳方式是什么。

  • 使用BigDecimal是一个好方法吗?
  • 这两个选项之间有什么不同吗?

2 个答案:

答案 0 :(得分:1)

我建议向用户显示setScale(2,BigDecimal.ROUND_HALF_UP).toPlainString()。

答案 1 :(得分:0)

  

使用doubleValue()是一个好方法吗?

如果您想避免使用double(或者您想控制数字的格式化方式),则使用BigDecimal是有意义的。如果你混合BigDecimaldouble,我看不出重点。您也可以一直使用double并简化代码。

如果要将值转换为字符串,请使用toString例如

BigDecimal bd = ...
System.out.println("bd: " + bd.toString());

或只是

System.out.println("bd: " + bd);

如果您想使用double,可以

double d = 
System.out.printf("%.2f%n", d); // round to 2 decimal places

BigDecimal可能更容易出错的一个例子。这两个答案都是错误的,但在BigDecimal的情况下,它不是很明显,无论是在代码中还是结果看起来都不错

System.out.println(BigDecimal.valueOf(1.00)
                             .divide(BigDecimal.valueOf(49), 2, BigDecimal.ROUND_HALF_UP)
                             .multiply(BigDecimal.valueOf(49)));
System.out.println(1.00 / 49 * 49);

打印

0.98
0.9999999999999999

你可以修复这两个代码,但第一种情况下存在问题的事实很容易被遗漏。提示:使用BigDecimal.valueOf不是问题。代码越详细(使用的符号越多),就越难看到重要的细节。