You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

求实现半舍入向下(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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 19:13:10