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

如何检查boost::multiprecision::cpp_dec_float可安全转换为整数和浮点数类型

小数部分判断有效性确认

你提供的小数部分为0的判断实现是正确的。extract_integer_part()对正负值都能正确提取整数部分,减去整数部分后得到的差值调用is_zero()即可准确判断是否存在非零小数位。


接口实现方案

以下是符合你要求的全套接口实现,完全避免了extract_signed_long_long这类方法的数值范围限制问题:

依赖头文件

#include <boost/multiprecision/cpp_dec_float.hpp>
#include <cstdint>
#include <limits>

using namespace boost::multiprecision;
using cpp_dec_float_100 = cpp_dec_float<100>;

1. 浮点数转换接口

符合要求:允许精度丢失,仅校验值整体在浮点数取值范围内

// double转换
bool can_be_converted_to_double(const cpp_dec_float_100& ft) {
    static const cpp_dec_float_100 double_max = std::numeric_limits<double>::max();
    static const cpp_dec_float_100 double_min = std::numeric_limits<double>::lowest();
    return ft >= double_min && ft <= double_max;
}

double converted_to_double(const cpp_dec_float_100& ft) {
    return ft.convert_to<double>();
}

// float转换
bool can_be_converted_to_float(const cpp_dec_float_100& ft) {
    static const cpp_dec_float_100 float_max = std::numeric_limits<float>::max();
    static const cpp_dec_float_100 float_min = std::numeric_limits<float>::lowest();
    return ft >= float_min && ft <= float_max;
}

float converted_to_float(const cpp_dec_float_100& ft) {
    return ft.convert_to<float>();
}

2. 整数类型转换接口

符合要求:必须无小数部分,且整数部分在目标类型取值范围内
首先提取通用的小数校验工具函数复用:

bool has_no_fractional_part(const cpp_dec_float_100& ft) {
    cpp_dec_float_100 int_part = ft.backend().extract_integer_part();
    return (ft - int_part).is_zero();
}
int8_t转换
bool can_be_converted_to_int8(const cpp_dec_float_100& ft) {
    if (!has_no_fractional_part(ft)) return false;
    static const cpp_dec_float_100 int8_max = std::numeric_limits<int8_t>::max();
    static const cpp_dec_float_100 int8_min = std::numeric_limits<int8_t>::min();
    return ft >= int8_min && ft <= int8_max;
}

int8_t converted_to_int8(const cpp_dec_float_100& ft) {
    return ft.convert_to<int8_t>();
}
uint8_t转换

无符号类型额外增加非负校验:

bool can_be_converted_to_uint8(const cpp_dec_float_100& ft) {
    if (ft < 0 || !has_no_fractional_part(ft)) return false;
    static const cpp_dec_float_100 uint8_max = std::numeric_limits<uint8_t>::max();
    return ft <= uint8_max;
}

uint8_t converted_to_uint8(const cpp_dec_float_100& ft) {
    return ft.convert_to<uint8_t>();
}

其他整数类型(int16/uint16/int32/uint32等)实现逻辑完全一致,仅需替换std::numeric_limits的模板参数即可。


注意事项

  • 所有边界值为静态常量,仅初始化一次,无额外性能开销
  • 调用转换函数前必须先执行对应的可行性校验,避免未定义行为
  • 无需依赖平台相关的整型截断方法,支持超大值的范围校验

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 02:45:03