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

Go语言unicode.IsNumber()函数输入轻微变动返回不同结果问题

异常现象原因
  • 你对unicode.IsNumber函数的功能存在根本误解:该函数的作用是判断传入的Unicode码点是否对应数字类字符,而非判断一个数值本身是不是数字类型。你直接将浮点数强制转换为rune类型,本质是把浮点数的整数部分当作Unicode码点传入校验,自然会出现不符合预期的结果。
  • 输入55.3时,rune(55.3)取整得到码点55,对应的ASCII字符是7,属于数字字符,因此函数返回true;输入58.3时,rune(58.3)取整得到码点58,对应的ASCII字符是:,不属于数字字符,因此函数返回false,这就是你观测到的差异的根本原因。
  • 额外逻辑错误:你没有正确处理fmt.Scan的返回值,该函数返回的err为nil时才代表输入合法,你当前的逻辑完全跳过了输入合法性校验,反而用错误的Unicode校验替代了输入校验。
修复方案

你的核心需求是读取浮点数后截断为整数输出,不需要调用unicode.IsNumber,直接校验输入是否成功即可,修复后代码如下:

package main

import (
    "fmt"
)

func main() {
    var truncint int
    var truncfloat float64

    fmt.Printf("Enter a floating point number: ")
    _, err := fmt.Scan(&truncfloat)
    if err == nil {
        truncint = int(truncfloat)
        fmt.Printf("Truncated number is: %d", truncint)
    } else {
        fmt.Printf("Input error: %s", err)
    }
}
  • 如果你有额外的数值范围校验需求,直接对truncfloat做数值大小判断即可,不要使用Unicode处理函数来校验数值类型变量。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 22:54:01