百分比调整后无法还原原数: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
相关产品推荐
相关产品推荐

