如何从已有double数值提取小数点前末两位与后两位生成新double数值
提取double数值指定部分生成新值的实现方案
要实现从现有double数值中提取小数点前最后两位和小数点后前两位生成新double的需求,直接用数值运算容易遇到精度问题,更稳妥的方式是通过字符串处理来实现,以下是具体步骤和代码示例:
处理逻辑
- 把double转为字符串,避免浮点运算的精度丢失;
- 定位字符串中的小数点位置,拆分出整数部分和小数部分;
- 提取整数部分的最后两位:若整数部分长度≥2,取末尾两位;若不足两位,直接取全部整数部分;
- 提取小数部分的前两位:若小数部分长度≥2,取前两位;若不足,补0凑够两位;
- 将提取的整数段和小数段拼接成
"XX.XX"格式的字符串,再转回double类型。
代码示例
Python实现
def extract_target_double(num): # 转为字符串,处理可能的科学计数法,保留足够小数位 num_str = "{0:.10f}".format(num).rstrip('0').rstrip('.') if '.' in "{0:.10f}".format(num) else "{0:.10f}".format(num) if '.' not in num_str: # 没有小数部分的情况,补.00 integer_part = num_str[-2:] if len(num_str)>=2 else num_str return float(f"{integer_part}.00") integer_part, decimal_part = num_str.split('.', 1) # 提取整数部分最后两位 target_integer = integer_part[-2:] if len(integer_part)>=2 else integer_part # 提取小数部分前两位,不足补0 target_decimal = decimal_part[:2].ljust(2, '0') # 拼接并转double return float(f"{target_integer}.{target_decimal}") # 测试示例 print(extract_target_double(1054001.4032)) # 输出1.40 print(extract_target_double(2015.0634547)) # 输出15.06 print(extract_target_double(319.00056)) # 输出19.00 print(extract_target_double(5.678)) # 输出5.67 print(extract_target_double(123.4)) # 输出23.40
Java实现
public class DoubleExtractor { public static double extractTargetDouble(double num) { // 转为字符串,处理科学计数法,去除末尾多余的0和小数点 String numStr = String.format("%.10f", num).replaceAll("0*$", "").replaceAll("\\.$", ""); int dotIndex = numStr.indexOf('.'); String targetInteger; String targetDecimal; if (dotIndex == -1) { // 无小数部分的情况 targetInteger = numStr.length() >= 2 ? numStr.substring(numStr.length() - 2) : numStr; targetDecimal = "00"; } else { String integerPart = numStr.substring(0, dotIndex); String decimalPart = numStr.substring(dotIndex + 1); // 提取整数部分最后两位 targetInteger = integerPart.length() >= 2 ? integerPart.substring(integerPart.length() - 2) : integerPart; // 提取小数部分前两位,不足补0 targetDecimal = decimalPart.length() >= 2 ? decimalPart.substring(0, 2) : decimalPart + "0".repeat(2 - decimalPart.length()); } return Double.parseDouble(targetInteger + "." + targetDecimal); } public static void main(String[] args) { System.out.println(extractTargetDouble(1054001.4032)); // 输出1.4 System.out.println(extractTargetDouble(2015.0634547)); // 输出15.06 System.out.println(extractTargetDouble(319.00056)); // 输出19.0 // 注:Java中double的19.00会显示为19.0,但实际值精度符合要求,若要保留两位小数格式展示可再做格式化 } }
注意事项
- 若原数值以科学计数法表示(比如
1.23e5),上述代码已做基础处理,确保能正确拆分整数和小数部分; - 最终生成的double数值,若小数末尾是0(比如19.00),在部分语言中会显示为19.0,但实际存储的精度是符合要求的,若需要以两位小数格式展示,可再做字符串格式化处理。
内容的提问来源于stack exchange,提问作者user406
相关产品推荐
相关产品推荐

