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

使用React state进行数学运算时parseInt转换失效如何解决

问题核心原因

  • tip状态从按钮赋值时是0.05、0.1这类小数,你用parseInt转换会直接截断小数部分得到0,导致运算失效
  • input输入值默认是字符串类型,你直接赋值给state后,后续如果输入非数字内容、空值,parseInt转换会得到NaN
  • 未做除数为0的边界判断,people为0时运算会得到无穷大的异常值

修复步骤

  1. 赋值时就把输入值转成数字存入state,不需要等到渲染时再转换,修改三个输入框的onChange逻辑:
// Bill输入框
<input type="text" onChange={e=>setBill(Number(e.target.value) || 0)}/>

// 自定义Tip输入框
<input type="text" placeholder='Custom' onChange={e=>setTip((Number(e.target.value) || 0)/100)}/>

// 人数输入框
<input type="text" placeholder='0' onChange={e=>setPeople(Number(e.target.value) || 0)} />
  1. 修改渲染时的运算逻辑,移除parseInt,加边界判断避免除0,同时保留两位小数优化金额显示:
{/* 人均小费 */}
<div>{people > 0 ? (bill * tip / people).toFixed(2) : 0}</div>

{/* 人均总金额 */}
<div>{people > 0 ? (bill * (1 + tip) / people).toFixed(2) : 0}</div>

完整修复后代码

import { useState } from 'react';

export default function Bill(){
  const [bill,setBill] = useState(0)
  const [tip,setTip] = useState(0)
  const [people,setPeople] = useState(0)

  function reset(){
    setBill(0)
    setTip(0)
    setPeople(0)
  }
    
  return(
    <div>
      <div>Bill
        <input type="text" onChange={e=>setBill(Number(e.target.value) || 0)}/>
      </div>
      
      <div>
        Select Tip %
        <button onClick={()=>setTip(0.05)}>5%</button>
        <button onClick={()=>setTip(0.1)}>10%</button>
        <button onClick={()=>setTip(0.15)}>15%</button>
        <button onClick={()=>setTip(0.25)}>25%</button>
        <button onClick={()=>setTip(0.5)}>50%</button>
        <input type="text" placeholder='Custom' onChange={e=>setTip((Number(e.target.value) || 0)/100)}/>
      </div>
    
      <div>
        Number of People
        <input type="text" placeholder='0' onChange={e=>setPeople(Number(e.target.value) || 0)} />
      </div>

      <div>
        <div>
          Tip Amount /person
          <div>{people > 0 ? (bill * tip / people).toFixed(2) : 0}</div>
        </div>
        <div>
          Total /person
          <div>{people > 0 ? (bill * (1 + tip) / people).toFixed(2) : 0}</div>
        </div>
        <button onClick={reset}>Reset</button>
      </div>
    </div>
  )
} 

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 01:42:03