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

百分比调整后无法还原原数:VB.NET价格更新代码优化问询

百分比价格更新无法还原原数的解决方法

问题现象

上涨5%后再下调5%无法回到原价:

上涨: 1 + 5% = 1.05 // 下调: 1.05 - 5% = 0.998

当前使用VB.NET执行SQL批量更新,正整数参数表示上涨,负整数表示下调,代码如下:

Imports System.Data.SqlClient
Public Class Form1
    Private cmd As SqlCommand
    Private cnn As New SqlConnection
    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        Dim iofile As New System.IO.StreamReader(Application.StartupPath + "/connect.txt")
        Dim ioline As String
        ioline = iofile.ReadToEnd
        cnn = New SqlConnection(ioline)
        cnn.Open()
        cmd = New SqlCommand("update saprod_01 set price1=price1+(price1*@calc1/100); 
        update saprod_01 set price2=price2+(price2*@calc2/100); 
        update saprod_01 set price3=price3+(price3*@calc3/100);", cnn)
        cmd.Parameters.Add("@calc1", SqlDbType.Decimal).Value = TextBox1.Text
        cmd.Parameters.Add("@calc2", SqlDbType.Decimal).Value = TextBox2.Text
        cmd.Parameters.Add("@calc3", SqlDbType.Decimal).Value = TextBox3.Text
        cmd.ExecuteNonQuery()
        MessageBox.Show("Updated", "Updated", MessageBoxButtons.OK, MessageBoxIcon.Information)
    End Sub
End Class

问题根源

当前逻辑是基于当前价格做百分比增减:

  • 上涨:价格 = 当前价 × (1 + 百分比/100)
  • 下调:价格 = 当前价 × (1 - 百分比/100)

这种计算下,先涨后跌的实际运算为 1 × 1.05 × 0.95 = 0.9975,自然无法回归原价。要实现还原,下调时需要基于原价的反向推导——用当前价格除以(1+上涨百分比),而非乘以(1-下调百分比)。

修改方案

调整SQL更新语句

通过CASE判断参数正负,分别使用乘/除逻辑:

update saprod_01 set price1 = CASE 
    WHEN @calc1 > 0 THEN price1 * (1 + @calc1/100.0)
    WHEN @calc1 < 0 THEN price1 / (1 - @calc1/100.0)
    ELSE price1
END;
update saprod_01 set price2 = CASE 
    WHEN @calc2 > 0 THEN price2 * (1 + @calc2/100.0)
    WHEN @calc2 < 0 THEN price2 / (1 - @calc2/100.0)
    ELSE price2
END;
update saprod_01 set price3 = CASE 
    WHEN @calc3 > 0 THEN price3 * (1 + @calc3/100.0)
    WHEN @calc3 < 0 THEN price3 / (1 - @calc3/100.0)
    ELSE price3
END;

注意用100.0而非100,确保计算时触发浮点数除法,避免整数截断误差。

VB代码优化(可选)

添加输入合法性校验,同时用Using语句自动释放资源,避免内存泄漏:

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    ' 验证输入有效性
    Dim calc1, calc2, calc3 As Decimal
    If Not Decimal.TryParse(TextBox1.Text, calc1) OrElse
       Not Decimal.TryParse(TextBox2.Text, calc2) OrElse
       Not Decimal.TryParse(TextBox3.Text, calc3) Then
        MessageBox.Show("请输入有效的百分比数值", "输入错误", MessageBoxButtons.OK, MessageBoxIcon.Error)
        Return
    End If

    ' 读取连接字符串
    Dim ioline As String = System.IO.File.ReadAllText(Application.StartupPath + "/connect.txt")
    
    ' 使用Using自动释放资源
    Using cnn As New SqlConnection(ioline)
        cnn.Open()
        Using cmd As New SqlCommand(【替换为上面修改后的SQL语句】, cnn)
            cmd.Parameters.Add("@calc1", SqlDbType.Decimal).Value = calc1
            cmd.Parameters.Add("@calc2", SqlDbType.Decimal).Value = calc2
            cmd.Parameters.Add("@calc3", SqlDbType.Decimal).Value = calc3
            cmd.ExecuteNonQuery()
        End Using
    End Using

    MessageBox.Show("Updated", "Updated", MessageBoxButtons.OK, MessageBoxIcon.Information)
End Sub

验证效果

  • 初始价格1,输入+5执行上涨:1 × 1.05 = 1.05
  • 输入-5执行下调:1.05 ÷ 1.05 = 1,成功还原原价

内容的提问来源于stack exchange,提问作者Roy Givenchi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 17:00:25