求实现半舍入向下(0.5→0)的round()替代函数方案
问题分析
你需要实现半舍入(Half Down)逻辑:小数部分小于0.5时舍去,等于0.5时舍去,大于0.5时进1(示例:0.4→0;9.5→9;10.6→11)。但现有代码的核心错误是先调用了Math.round()将计算结果转成整数,丢失了原始小数部分的信息,导致后续的半舍入逻辑完全无法生效。
现有代码的问题
第一段代码
var height = Math.round(width / firstNum * thecondNum).toInt() var e = height.toDouble() var roundedHalfDown = e.toBigDecimal().setScale(0, ROUND_HALF_DOWN).toDouble().toInt() return ("$width x $roundedHalfDown").replace(" ","")
- 第一步
Math.round()已经将原始计算结果(比如1457/4*3=1092.75)四舍五入为整数1093,后续将整数转成double再处理,本质是对1093.0进行舍入,结果还是1093,完全没有实现半舍入。
第二段代码
var height = Math.round(width / firstNum * thecondNum).toInt() var e = height.toDouble() var r = Math.floor(e) if ((height % 10) == 5){ r -= 1 return ("$width x $r").replace(" ","") } else return ("$width x $height").replace(" ","")
- 同样先调用
Math.round()丢失了小数信息,且判断height%10==5的逻辑完全错误:半舍入需要判断的是原始计算结果的小数部分,而非整数的个位数字,完全偏离需求。
正确实现方案
方案一:用BigDecimal精确处理(推荐,避免浮点数精度误差)
import java.math.BigDecimal import java.math.RoundingMode fun calculateDimension(width: Int, ratioWidth: Int, ratioHeight: Int): String { // 用BigDecimal精确计算高度,避免浮点数精度丢失 val heightDecimal = BigDecimal(width) .multiply(BigDecimal(ratioHeight)) .divide(BigDecimal(ratioWidth), 10, RoundingMode.HALF_UP) // 保留足够小数位保证计算精度 // 应用半舍入规则:0.5及以下舍去,0.6及以上进1 val roundedHeight = heightDecimal.setScale(0, RoundingMode.HALF_DOWN).toInt() return "${width}x$roundedHeight" }
- 测试验证:
- 0.4 → 0
- 9.5 →9
-10.6→11 - 1457(4:3比例):计算得1092.75,半舍入后为1093(符合半舍入规则,若你预期1092,可能是需求为向下取整或比例搞反,需确认)
方案二:手动实现半舍入逻辑(仅适用于正数场景)
fun calculateDimension(width: Int, ratioWidth: Int, ratioHeight: Int): String { val rawHeight = width.toDouble() * ratioHeight / ratioWidth val floorHeight = Math.floor(rawHeight) val decimalPart = rawHeight - floorHeight // 半舍入逻辑:小数部分>0.5才进1,否则舍去 val roundedHeight = if (decimalPart > 0.5) { floorHeight.toInt() + 1 } else { floorHeight.toInt() } return "${width}x$roundedHeight" }
- 该逻辑完全匹配你给出的示例,且直接基于原始小数结果处理,不会丢失精度信息。
内容的提问来源于stack exchange,提问作者Kirill
相关产品推荐
相关产品推荐

