Double、String、Integer转换异常导致BTC汇率计算结果错误问题
问题根源
- 现有代码的核心错误是处理
usdRate时把小数点也直接移除了,比如原始usdRate为"44,950.4794",先去掉逗号得到"44950.4794",再移除小数点直接变成"449504794",转成整数后乘以0.00000001自然就得到了你看到的4.49504794,和预期逻辑完全不符。 - 你给出的计算示例和文字描述的逻辑有冲突,以下代码统一按你明确说明的逻辑实现:
用户输入值 * 0.00000001 * usdRate。
修正后代码(含usdRate长度限制)
// 1. 取出原始usdRate字符串 var usdRate: String = JSONObject(json).getJSONObject("bpi").getJSONObject("USD")["rate"] as String // 2. 移除千位分隔符逗号 usdRate = usdRate.replace(",", "") // 3. 实现长度限制:移除末尾4个字符,要保留总共5位数字可以替换这段逻辑 if (usdRate.length > 4) { usdRate = usdRate.dropLast(4) } // 4. 正确转为Double类型,不要移除小数点 val usdRateNum = usdRate.toDouble() // 5. 常量定义 val satoshiUnit = 0.00000001 // 6. 取用户输入值 val ddx: EditText = findViewById(R.id.editTextNumber2) val inputVal = ddx.text.toString().toDouble() // 7. 按正确逻辑计算 val result = inputVal * satoshiUnit * usdRateNum // 8. 格式化输出避免小数过长 usdView.text = "%.12f".format(result)
可选长度限制逻辑(保留总共5位数字)
如果需求是保留总共5位数字,把上面第3步的代码替换为以下内容即可:
usdRate = usdRate.replace(Regex("(\\d{5})[^\\d]*.*"), "$1")
内容的提问来源于stack exchange,提问作者AnxiousDino
相关产品推荐
相关产品推荐

