时间:2021-05-19
复制代码 代码如下:
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/**
* 大数乘法的简单实现, 目前还不是很完善
* Fix:
* 1. 修改前后删除0的一些错误情况
* 2. 支持负数运算
* 3. 判断输入字符串是否符合小数定义, 用正则表达式判断
* @author icejoywoo
* @since 2012.2.16
* @version 0.1.1
*/
public class BigNumber {
public static void main(String[] args) throws IOException {
System.out.println("Input two large integers:");
BufferedReader buffer = new BufferedReader(new InputStreamReader(System.in));
String[] strArray = buffer.readLine().split("\\*");
System.out.println(bigNumberMultiply(strArray[0], strArray[1]));
}
/**
* 计算两个任意大小和精度的数的乘积
* @param first 第一个参数
* @param second 第二个参数
* @return 两个数的乘积
*/
private static String bigNumberMultiply(String first, String second) {
// 正负号判断标志
boolean flag = false;
if (first.charAt(0) == '-') {
flag = !flag;
first = first.substring(1);
}
if (second.charAt(0) == '-') {
flag = !flag;
second = second.substring(1);
}
// 小数点的位置
int aPoints = first.length() - first.indexOf('.') - 1;
int bPoints = second.length() - second.indexOf('.') - 1;
int pointPos = aPoints + bPoints; // 结果的小数点位置
// 删除小数点
StringBuffer aBuffer = new StringBuffer(first.replaceAll("\\.", ""));
StringBuffer bBuffer = new StringBuffer(second.replaceAll("\\.", ""));
int[] a = string2IntArray(aBuffer.toString());
int[] b = string2IntArray(bBuffer.toString());
int[] result = new int[a.length + b.length - 1]; // 保存结果的数组
// 计算
for (int i = 0; i < a.length; i++) {
for (int j = 0; j < b.length; j++) {
result[i + j] += a[i] * b[j];
}
}
// result中的某一位大于9的话需要进位
for (int i = result.length - 1; i >= 0; --i) {
if (result[i] > 9) {
result[i - 1] += result[i] / 10;
result[i] = result[i] % 10;
}
}
StringBuffer buffer = new StringBuffer(); // 将result数组转换为字符串
for (int i = 0; i < result.length; ++i) {
// 添加小数点
if(result.length - i == pointPos) {
buffer.append(".");
}
buffer.append(String.valueOf(result[i]));
}
if (buffer.indexOf(".") != -1)
{
// 删除最开始的0
int i = 0;
while (i < buffer.length()) {
if (buffer.length() > 2 && buffer.charAt(i+1) == '.') { // 小数点前只有一个数 0.
break;
} else if (buffer.charAt(i) == '0') { // 删除最前边的0
buffer.deleteCharAt(i);
i = 0;
continue;
} else { // 当第一位不是0的时候
break;
}
}
// 删除末尾的0
i = buffer.length() - 1;
while (i >= 0) {
if (buffer.length() > 2 && buffer.charAt(i-1) == '.') { // 小数点后直接是数字
break;
} else if (buffer.charAt(i) == '0') { // 删除末尾的0
buffer.deleteCharAt(i);
i = buffer.length() - 1;
continue;
} else { // 当最后一位不是0的时候
break;
}
}
}
// 根据符号位, 返回值的正负标志
if (flag) {
return "-" + buffer.toString();
} else {
return buffer.toString();
}
}
/**
* 将字符串装换为数组
* @param number
* @return
*/
private static int[] string2IntArray(String number) {
// 判断输入是否符合浮点数的要求
Pattern pattern = Pattern.compile("^(-?\\d+|\\d*)\\.?\\d*$");
Matcher matcher = pattern.matcher(number);
if (!matcher.find()) {
throw new IllegalArgumentException("输入的数不正确!");
}
int[] result = new int[number.length()];
for (int i = 0; i < number.length(); i++) {
result[i] = (int) (number.charAt(i) - '0');
}
return result;
}
}
运行结果如下:
1. 错误输入的判断
复制代码 代码如下:
Input two large integers:
1a*a22
Exception in thread "main" java.lang.IllegalArgumentException: 输入的数不正确!
at BigNumber.string2IntArray(BigNumber.java:132)
at BigNumber.bigNumberMultiply(BigNumber.java:54)
at BigNumber.main(BigNumber.java:22)
2. 带负数的运算, 前后带有0的情况
复制代码 代码如下:
Input two large integers:
-23424.2300*02345.23400000
-54935300.61982
python中计算的结果如下
复制代码 代码如下:
Python 2.6.5
>>> -23424.2300*02345.23400000
-54935300.619819999
可以看出python的结果是有失真的
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
[Python标准库]decimal——定点数和浮点数的数学运算作用:使用定点数和浮点数的小数运算。Python版本:2.4及以后版本decimal模块实现了定
本文实例为大家分享了C++实现浮点数精确加法的具体代码,供大家参考,具体内容如下实现两个正浮点数的精确加法参与运算的浮点数及计算结果所需存储空间都不会超过mai
1.浮点数的介绍float(浮点型)是Python基本数据类型中的一种,Python的浮点数类似数学中的小数和C语言中的double类型;2.浮点型的运算浮点数
4.定点数模拟浮点数运算及常见的策略 相信大家到现在已经大致明白了浮点数转换成定点数运算的概貌。其实,原理讲起来很简单,真正应用到实际的项目中,可能会遇到各种
上节课简单介绍了浮点数。计算机程序中的浮点数分为单精度浮点数和双精度浮点数。单精度和双精度精确的范围不一样。计算机里的最基本的存储单位用位(bit)来表示。bi