PHP函数 bcmul 讲解

本文介绍了PHP中的bcmul函数,用于进行任意精度数字乘法运算,包括函数用法、参数说明、示例以及PHP7.3之前的精度问题。

bcmul:两个任意精度数字乘法计算

用法:

bcuml(string $num1,string $num2,int $scale = null):string

 num1乘以num2

参数说明:

num1:字符串类型的左操作数。

num2:字符串类型的右操作数。

scale:可选参数,用于设置结果中小数点后的小数位数,默认值为0。

返回值:该函数以字符串形式返回两个数字$num1和$num2的乘积。

例子:

<?php
echo bcmul('1.34747474747', '35', 3); // 47.161
echo bcmul('2', '4'); // 8
?>

在PHP 7.3.0之前,bcmul() 可能会返回小数点后位数少于小数位数的结果。只有当结果不需要刻度所允许的所有精度时,才会出现这种情况。

例如:

<?php
echo bcmul('5', '2', 2); // prints "10", not "10.00"
?>

参考:PHP: bcmul - Manual

# 简单的周边交易系统 (C# ASP.NET Web Forms) 下面是一个不使用JavaScript、MVC和web.config的简单周边交易系统,基于C# ASP.NET Web Forms实现。 ## 1. 创建ASP.NET Web Forms项目 首先创建一个新的ASP.NET Web Forms项目。 ## 2. 数据库设计 (使用代码中的内存数据库) 由于不使用web.config,我们将使用内存中的数据存储。 ## 3. 代码实现 ### Default.aspx ```html <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="SimpleTradeSystem.Default" %> <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head runat="server"> <title>简单周边交易系统</title> <style> body { font-family: Arial; margin: 20px; } .container { width: 800px; margin: 0 auto; } .product-list { float: left; width: 60%; } .cart { float: right; width: 35%; border: 1px solid #ccc; padding: 10px; } .product { border: 1px solid #ddd; margin-bottom: 10px; padding: 10px; } .clear { clear: both; } </style> </head> <body> <form id="form1" runat="server"> <div class="container"> <h1>周边商品交易系统</h1> <div class="product-list"> <h2>商品列表</h2> <asp:Repeater ID="rptProducts" runat="server" OnItemCommand="rptProducts_ItemCommand"> <ItemTemplate> <div class="product"> <h3><%# Eval("Name") %></h3> <p>价格: <%# Eval("Price", "{0:C}") %></p > <p>库存: <%# Eval("Stock") %></p > <asp:Button ID="btnAddToCart" runat="server" Text="加入购物车" CommandName="AddToCart" CommandArgument='<%# Eval("Id") %>' /> </div> </ItemTemplate> </asp:Repeater> </div> <div class="cart"> <h2>购物车</h2> <asp:Repeater ID="rptCart" runat="server" OnItemCommand="rptCart_ItemCommand"> <ItemTemplate> <div> <%# Eval("ProductName") %> - <%# Eval("Quantity") %> × <%# Eval("Price", "{0:C}") %> = <%# Eval("TotalPrice", "{0:C}") %> <asp:Button ID="btnRemove" runat="server" Text="移除" CommandName="RemoveFromCart" CommandArgument='<%# Eval("ProductId") %>' /> </div> </ItemTemplate> </asp:Repeater> <div style="margin-top: 20px; font-weight: bold;"> 总计: <asp:Label ID="lblTotal" runat="server" Text="$0.00"></asp:Label> </div> <asp:Button ID="btnCheckout" runat="server" Text="结算" OnClick="btnCheckout_Click" style="margin-top: 10px; padding: 5px 15px;" /> <asp:Label ID="lblMessage" runat="server" Text="" ForeColor="Red"></asp:Label> </div> <div class="clear"></div> </div> </form> </body> </html> ``` ### Default.aspx.cs ```csharp using System; using System.Collections.Generic; using System.Web.UI; using System.Web.UI.WebControls; namespace SimpleTradeSystem { public partial class Default : System.Web.UI.Page { // 内存数据库 public static List<Product> Products = new List<Product> { new Product { Id = 1, Name = "限量版T恤", Price = 99.99m, Stock = 10 }, new Product { Id = 2, Name = "纪念徽章", Price = 29.99m, Stock = 20 }, new Product { Id = 3, Name = "签名海报", Price = 49.99m, Stock = 5 }, new Product { Id = 4, Name = "主题水杯", Price = 39.99m, Stock = 15 } }; public static Dictionary<int, CartItem> ShoppingCart = new Dictionary<int, CartItem>(); protected void Page_Load(object sender, EventArgs e) { if (!IsPostBack) { BindProducts(); BindCart(); } } private void BindProducts() { rptProducts.DataSource = Products; rptProducts.DataBind(); } private void BindCart() { rptCart.DataSource = ShoppingCart.Values; rptCart.DataBind(); CalculateTotal(); } protected void rptProducts_ItemCommand(object source, RepeaterCommandEventArgs e) { if (e.CommandName == "AddToCart") { int productId = Convert.ToInt32(e.CommandArgument); AddToCart(productId); } } protected void rptCart_ItemCommand(object source, RepeaterCommandEventArgs e) { if (e.CommandName == "RemoveFromCart") { int productId = Convert.ToInt32(e.CommandArgument); RemoveFromCart(productId); } } private void AddToCart(int productId) { var product = Products.Find(p => p.Id == productId); if (product == null || product.Stock <= 0) { lblMessage.Text = "商品已售罄或不存在"; return; } if (ShoppingCart.ContainsKey(productId)) { ShoppingCart[productId].Quantity++; } else { ShoppingCart.Add(productId, new CartItem { ProductId = productId, ProductName = product.Name, Price = product.Price, Quantity = 1 }); } product.Stock--; BindProducts(); BindCart(); lblMessage.Text = ""; } private void RemoveFromCart(int productId) { if (ShoppingCart.ContainsKey(productId)) { var cartItem = ShoppingCart[productId]; var product = Products.Find(p => p.Id == productId); if (product != null) { product.Stock += cartItem.Quantity; } ShoppingCart.Remove(productId); BindProducts(); BindCart(); } } private void CalculateTotal() { decimal total = 0; foreach (var item in ShoppingCart.Values) { total += item.TotalPrice; } lblTotal.Text = total.ToString("C"); } protected void btnCheckout_Click(object sender, EventArgs e) { if (ShoppingCart.Count == 0) { lblMessage.Text = "购物车为空,无法结算"; return; } // 这里简单模拟结算过程 ShoppingCart.Clear(); BindCart(); lblMessage.Text = "结算成功!感谢您的购买!"; } } public class Product { public int Id { get; set; } public string Name { get; set; } public decimal Price { get; set; } public int Stock { get; set; } } public class CartItem { public int ProductId { get; set; } public string ProductName { get; set; } public decimal Price { get; set; } public int Quantity { get; set; } public decimal TotalPrice => Price * Quantity; } } ``` ## 4. 功能说明 1. **商品展示**:显示所有周边商品,包括名称、价格和库存 2. **购物车功能**: - 添加商品到购物车 - 从购物车移除商品 - 显示购物车总价 3. **结算功能**:简单的结算模拟 4. **库存管理**:添加/移除商品时会自动更新库存 ## 5. 注意事项 1. 这是一个纯服务器端的实现,完全不使用JavaScript 2. 数据存储在内存中,应用重启后会丢失 3. 没有使用MVC架构,而是传统的Web Forms 4. 没有使用web.config文件进行配置 5. 界面简单,但功能完整 给它增加一个登录页面和注册页面
06-18
前端代码: <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="default.aspx.cs" Inherits="listview增删改查._default" %> <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head runat="server"> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title></title> <style type="text/css"> .divItem { padding: 5px; } .divBtns { width:130px; } .divInfo { width:350px; padding:0px 10px 0px 10px; border-left:1px solid #dadada; border-right:1px solid #dadada; } .divInfo2 { width:200px; } .divBtns, .divInfo, .divInfo2 { float:left; } .clr { clear:both; } </style> </head> <body> <form id="form1" runat="server"> <div> <asp:ListView ID="ListView1" runat="server" DataSourceID="SqlDataSource2" ItemPlaceholderID="itemholder"> <LayoutTemplate> <div runat="server" id="itemholder"></div> </LayoutTemplate> <ItemTemplate> <div id="divItem"> <div class="divBtns"> <asp:Button ID="btn_edit" runat="server" Text="编辑" CommandName="edit" /><br/> <asp:Button ID="btn_delete" runat="server" Text="删除" CommandName="delete" /> <asp:Button ID="btn_delmak" runat="server" Text="标记删除" CommandName="lvcmd" CommandArgument='<%#Eval("se_id") %>' onCommand="mycmd" /> </div> <div class="divInfo"> <h2><%#Eval("se_name") %></h2> <p><%#Eval("se_memo") %></p> </div> <div class="divInfo2"> <asp:CheckBox ID="chk_enable" runat="server" Checked='<%#Eval("se_enable") %>' Enabled="false" Text="有效性" /><br/> <p>排序:<%#Eval("se_order") %></p> </div> <div class="clr"></div> </div> </ItemTemplate> </asp:ListView> <asp:SqlDataSource ID="SqlDataSource2" runat="server" ConnectionString="<%$ ConnectionStrings:ConnectionString9 %>" DeleteCommand="DELETE FROM [T_SERIES] WHERE [se_id] = ?" InsertCommand="INSERT INTO [T_SERIES] ([se_id], [se_name], [se_memo], [se_order], [se_enable], [se_delete]) VALUES (?, ?, ?, ?, ?, ?)" ProviderName="<%$ ConnectionStrings:ConnectionString9.ProviderName %>" SelectCommand="SELECT * FROM [T_SERIES] WHERE SE_DELETE=FALSE" UpdateCommand="UPDATE [T_SERIES] SET [se_name] = ?, [se_memo] = ?, [se_order] = ?, [se_enable] = ?, [se_delete] = ? WHERE [se_id] = ?"> <DeleteParameters> <asp:Parameter Name="se_id" Type="Int32" /> </DeleteParameters> <InsertParameters> <asp:Parameter Name="se_id" Type="Int32" /> <asp:Parameter Name="se_name" Type="String" /> <asp:Parameter Name="se_memo" Type="String" /> <asp:Parameter Name="se_order" Type="Int32" /> <asp:Parameter Name="se_enable" Type="Boolean" /> <asp:Parameter Name="se_delete" Type="Boolean" /> </InsertParameters> <UpdateParameters> <asp:Parameter Name="se_name" Type="String" /> <asp:Parameter Name="se_memo" Type="String" /> <asp:Parameter Name="se_order" Type="Int32" /> <asp:Parameter Name="se_enable" Type="Boolean" /> <asp:Parameter Name="se_delete" Type="Boolean" /> <asp:Parameter Name="se_id" Type="Int32" /> </UpdateParameters> </asp:SqlDataSource> </div> </form> </body> </html> 后端代码: using System; using System.Collections.Generic; using System.Data.OleDb; using System.Linq; using System.Web; using System.Web.UI; using System.Web.UI.WebControls; namespace listview增删改查 { public partial class _default : System.Web.UI.Page { string str_cnn = "Provider=Microsoft.ACE.OLEDB.12.0; Data Source="; string str_sourcefile = "mdb\\TB-HLINKS.accdb"; OleDbConnection cnn; OleDbCommand cmd; OleDbDataReader datar; string str_sql; protected void Page_Load(object sender, EventArgs e) { } protected void mycmd(object sender, CommandEventArgs e) { string str_conn = str_cnn + MapPath(str_sourcefile); cnn = new OleDbConnection(str_conn); cnn.Open(); str_sql = "update T_SERIES set se_delete =true where " + "se_id =" + e.CommandArgument.ToString(); cmd = new OleDbCommand(str_sql, cnn); cmd.ExecuteNonQuery(); cnn.Close(); ListView1.DataBind(); } } } 不能更改数据,什么原因呢?
最新发布
08-15
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值