将带有1个十进制数字的双精度数字转换为2个数字

时间:2018-12-04 23:20:47

标签: java android firebase

我需要将此价格用作价格。因此,如果用户写25,我想将25.00加载到数据库,如果他写25.1,则应该为25.10。 我不知道该怎么做。实际上,这就是我要做的:

    EditText cost = findViewById(R.id.cost_single);

    // Temp var with the value of the Edit Text
    String costTemp = cost.getText().toString();


    if(descriptionPayment.length() > 0 && costTemp.length() > 0) {
        costPayment= Double.parseDouble(costTemp);
        Map<String, Object> payment = new HashMap<>();
        payment.put("cost", costPayment);
        payment.put("payed by", payedByText);
        db.collection("users").document(email).collection("Group").document(groupName)
                .collection("Payments").document(descriptionPayment)
                .set(payment)
        // rest of my code

即使成本值在点后没有任何数字,如何上传带两位小数的双精度值?

2 个答案:

答案 0 :(得分:2)

tl; dr

new DecimalFormat( "##.00" )
.format(
    new BigDecimal( "25.1" ) 
)
  

25.10

BigDecimal

如果要精确表示小数,请使用BigDecimal类。始终用BigDecimal处理金钱问题。

BigDecimal bd = new BigDecimal( "25.1" ) ;

浮点数

如果要牺牲准确性来提高执行速度,请使用float / Float(32位)或double / Double。这些使用floating-point技术。因此,切勿将它们用于金钱或准确性比性能更重要的其他情况。

字符串

无论哪种方式,请记住您的基本数学知识。数字25.1和25.10在逻辑上是相同的数字。

因此,您真正要问的是“如何生成文本来用两位小数表示我的数字?”。

对于浮点类型,请使用DecimalFormat类。

DecimalFormat df = new DecimalFormat( "##.00" ) ;
String output = df.format( Double.parseDouble( "25.1" ) ;

请参见此代码run live at IdeOne.com

  

25.10

您也可以本地化。在some cultures(例如美国)中,将FULL STOP用作小数点分隔符,而在other places中则使用COMMA。搜索堆栈溢出以获取更多信息,因为已涵盖了该信息。

用于生成表示BigDecimal值的字符串的类似方法。

BigDecimal bd = new BigDecimal( "25.1" ) ;
DecimalFormat formatterBd = new DecimalFormat( "##.00" );
String outputBd = formatterBd.format( bd ) ;

请参见此代码run live at IdeOne.com

  

25.10

舍入

另一个相关的问题是,如果您的数字中的小数位数比要打印的位数多,则四舍五入。搜索堆栈溢出,因为已经解决了很多次。

关于IdeOne.com

关于上面指向IdeOne.com上运行代码的链接,该站点中的JVM被绑定为仅使用一个单一的语言环境Locale.US。尝试指定其他语言环境失败。因此,您不能在那里进行上述本地化操作。

答案 1 :(得分:1)

如果您可以使用Big Decimal(如注释中所述,这是正确的做法),那么在this tutorial中您可以找到所需的示例。 可以在instead处找到Big Decimal文档。 归结为:

override init(nibName nibNameOrNil: String?, bundle nibBundleOrNil: Bundle?) {
   historyRef = ref.child("history").childByAutoId()   
}

其中2表示应该显示多少个十进制,而舍入值表示在这种情况下如果大于2则如何舍入数字。请检查文档,因为您可能想使用其他舍入值。