Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/381.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用Java BigDecimal表示15精度的数字(比例为2)_Java_Precision_Bigdecimal - Fatal编程技术网

使用Java BigDecimal表示15精度的数字(比例为2)

使用Java BigDecimal表示15精度的数字(比例为2),java,precision,bigdecimal,Java,Precision,Bigdecimal,我找到了部分答案,但我已经知道了。所以我决定发布一个新问题 我正在尝试将HTTP请求参数字符串转换为15精度的Java BigDecimal数字(比例为2)。比如说, String x = request.getParameter("seqNo"); /* e.g. 12345678910111213141516.17181920 whatever */ // I want to convert x so that it has a precision of 15 and scale of 2

我找到了部分答案,但我已经知道了。所以我决定发布一个新问题

我正在尝试将HTTP请求参数字符串转换为15精度的Java BigDecimal数字(比例为2)。比如说,

String x = request.getParameter("seqNo"); /* e.g. 12345678910111213141516.17181920 whatever */
// I want to convert x so that it has a precision of 15 and scale of 2 i.e. 111213141516.17.

我不在乎四舍五入。这是一种参考数,与四舍五入无关。我知道可以使用重载的
setScale(int)
方法设置缩放,该方法将返回缩放(截断?)的BigDecimal。但是如何确保正确设置精度?

使用子字符串如何?无论如何,这不是一个真正的数字

int pos = x.indexOf('.');
String y = x.substring(pos - 12, pos + 3);
如果你真的疯了,想把它当作数字来处理(四舍五入中的冲突和差异迟早会让你抓狂的),你可以这样做

double v = Double.parseDouble(y); // REALLY REALLY REALLY NOT RECOMMENDED.
但是这是一个非常糟糕的主意。不要把不是数字的东西挤进数字列。下周,你会得到两个点的数字,它会以各种可能的方式打破

如果您不需要进行数学计算,将此类字段视为
VARCHAR
TEXT
是完全可以接受的。因为这就是它:一系列的字符。不是数字


事实上,我强烈建议将整数存储为
VARCHAR
。它是一个唯一的标识符,而不是用于计算的数学数字。

所以您不仅要对尾随数字进行四舍五入,还要忽略前导数字?老实说,听起来你根本不应该把它当作一个数字来对待。。。您能告诉我们更多关于输入的含义吗?@JonSkeet如问题中所述,一个参考号,供开发人员内部参考“一个参考号”远远不是一个详细的描述。为什么您的示例中“111”之前的数字不相关?根据Anony Mouse的回答,这真的不应该被认为是一个数字,IMO。如果他们决定下周添加另一个组件呢?假设他们现在使用多台服务器,下周他们的ID是
1234567.89012345.5
,其中最后一个组件是服务器号,他们真的需要这个。。。把它当作字符串处理,你就安全了,其他任何东西最终都会让你发疯。@Anony Mouse谢谢:)好吧,我正试图把它列在SQL server上,java中推荐的DECIMAL(p,s)类型等效于BigDecimal。但是是的,这似乎是一种方法。为什么不使用
TEXT
VARCHAR
?通过截断将这个ID(可能不是数字)转换成数字列类型听起来是最糟糕的解决方案。修复需求,而不是破坏数据。这并不是第一次需求被证明有缺陷。这听起来好像要求被打破了@ha9u63ar有什么样的要求迫使您将非十进制数的事物视为十进制数?