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

如何使用Math.floor实现银行页面输入金额的向下取整?

问题描述

我正在为学校制作一个“Bank”页面,其中一项要求是存款或取款的输入数值必须向下取整(无小数部分)。我尝试过限制输入框无法输入逗号或点,但这并非我想要的实现方式。我曾在代码的不同位置尝试使用Math.floor(balance.innerText)和Math.floor(Number),但都没能成功实现需求。

以下是我的代码:

JavaScript代码

let deposit = document.getElementById('in'),
withdraw = document.getElementById('out'),
balance = document.getElementById('balance'),
depositInput = document.getElementById('depvalue'),
withdrawInput = document.getElementById('outvalue'),
depositBtn = document.getElementById('deposit-btn'),
withdrawBtn = document.getElementById('out-btn');

depositBtn.addEventListener('click', () => {
let value = depositInput.value;
if (Number(value) < 0.1) {
    alert("Invalid number")
} else if (Number(value) == ","){
    alert("Invalid number")
}
else {
let depositValue = Number(deposit.innerText) + Number(value);
let balanceValue = Number(balance.innerText) + Number(value);
deposit.innerText = depositValue;
balance.innerText = balanceValue;
depositInput.value = '';
}
})

withdrawBtn.addEventListener('click', () => {
let value = withdrawInput.value;
if (Number(value) > Number(balance.innerText)) {
    alert("You don't have enough balance to withdraw.");
}  else if (Number(value) < 0.9) {
    alert("Invalid number");
}
else {
    let balanceValue = Number(balance.innerText) - Number(value);
    let withdrawValue = Number(withdraw.innerText) + Number(value);
    withdraw.innerText = withdrawValue;
    balance.innerText = balanceValue;
    withdrawInput.value = '';
}
})

HTML代码

<!DOCTYPE html>
<html> 
<body>
<header>
    <h1>Bank</h1>
    <h3>Welcome ::User::</h3>
</header>

<main>
<div class="saldo">
    <div class="in">
        <h5>Deposit</h5>
        <h2><span id="in">0</span>kr</h2>
    </div>
    <div class="balance">
        <h5>Saldo</h5>
        <h2 class="balance"><span id="balance"> 1000</span>kr</h2>
    </div>
    <div class="out">
        <h5>Withdrawal</h5>
        <h2><span id="out">0</span>kr</h2>
    </div>
</div>

<div class="inut">
    <div class="deposit">
        <h2>Deposit</h2>
        <input type="number" id="depvalue">
        <button id="deposit-btn">Deposit</button>
    </div>

    <div class="withdrawal">
        <h2>Withdrawal</h2>
        <input type="number" id="outvalue">
        <button id="out-btn">Withdrawal</button>
    </div>
</div>
</main>
<footer>
<div class="logout">
    <a href="index.html">Log Out</a>
</div>
</footer>

<script src="js/bank.js"></script>
</body>
</html>

解决方案

你之前的核心问题是没有正确对用户输入的数值应用Math.floor,而是错误地将其用在余额文本或空的Number构造函数上。下面是修改后的代码,同时优化了验证逻辑:

修改后的JavaScript代码

let deposit = document.getElementById('in'),
withdraw = document.getElementById('out'),
balance = document.getElementById('balance'),
depositInput = document.getElementById('depvalue'),
withdrawInput = document.getElementById('outvalue'),
depositBtn = document.getElementById('deposit-btn'),
withdrawBtn = document.getElementById('out-btn');

depositBtn.addEventListener('click', () => {
    let value = Number(depositInput.value);
    // 对输入值向下取整,确保最终使用整数金额
    const flooredValue = Math.floor(value);
    
    // 验证:取整后的值必须大于0,覆盖小数、0、负数等无效情况
    if (flooredValue <= 0) {
        alert("Invalid number");
        return;
    }

    // 先转换当前存储的数值,避免重复操作
    const currentDeposit = Number(deposit.innerText);
    const currentBalance = Number(balance.innerText);
    
    deposit.innerText = currentDeposit + flooredValue;
    balance.innerText = currentBalance + flooredValue;
    depositInput.value = '';
})

withdrawBtn.addEventListener('click', () => {
    let value = Number(withdrawInput.value);
    const flooredValue = Math.floor(value);
    
    if (flooredValue <= 0) {
        alert("Invalid number");
        return;
    }

    const currentBalance = Number(balance.innerText);
    if (flooredValue > currentBalance) {
        alert("You don't have enough balance to withdraw.");
        return;
    }

    const currentWithdraw = Number(withdraw.innerText);
    withdraw.innerText = currentWithdraw + flooredValue;
    balance.innerText = currentBalance - flooredValue;
    withdrawInput.value = '';
})

额外优化建议

如果想让浏览器默认限制输入小数,可以修改HTML中的input标签,添加step="1"属性:

<input type="number" id="depvalue" step="1">
<input type="number" id="outvalue" step="1">

关键修改点说明

  • 先将用户输入转为数字,再用Math.floor()对输入值取整,确保运算时使用的是整数
  • 简化验证逻辑:只要取整后的值≤0就判定为无效输入,无需单独判断逗号或小数阈值
  • 提前转换当前余额、存款、取款的文本值为数字,提升代码可读性和执行效率

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 03:17:03