당신은 바로 복식으로 이상한 일이 있습니다. 출력되는 것은 변수의 내용과 다릅니다. 예를 들어
: 손상이 이중으로 문자열의 변환에서 이루어집니다
groovy:000> "123.0001".toBigDecimal()
===> 123.0001
groovy:000> "123.0001".toDouble()
===> 123.0001
groovy:000> new BigDecimal("123.0001".toDouble())
===> 123.000100000000003319655661471188068389892578125
주의, 이중이 BigDecimal로 전달하지. BigDecimal에 double을 공급하면 toString이 거짓말하기 때문에 실제 double을 실제로 볼 수 있습니다.
Jon Skeet이 지적했듯이 여기에는 정확도가 옵션이 아닙니다. 그러나 화면에 인쇄 값을 가정하면 두 배에 toString를 호출 한 결과이며,이 같은 이중의 toString 버전보다 더 잘못하지 BigDecimal를 얻을 수있을 것입니다 :
groovy:000> d = "123.0001".toDouble()
===> 123.0001
groovy:000> d.toString()
===> 123.0001
groovy:000> new BigDecimal(d.toString())
===> 123.0001
따라서 BigDecimal을 사용할 필요가 없습니다. 실제로는 다음과 같이 할 수 있습니다.
groovy:000> d = 123.0001
===> 123.0001
groovy:000> s = d.toString()
===> 123.0001
groovy:000> s.substring(s.indexOf('.')).length() - 1
===> 4
죄송합니다. 편집하여 의견을 무효화하십시오.
여기 BTW는 그루비로 번역 된 Steve의 답변에 가까운 것입니다.(나는 로케일이 엉망으로 된 기계에서 이것을 실행하면 소수점을위한 마침표를 사용하지 않기 때문에 반환 값 0보다 오히려 폭파 할 것이기 때문에 소수점을 찾을 수 없습니다.)
def getPlaces(d) {
s = d.toString()
s.substring(s.indexOf(".")).length() - 1
}
각주 : 이것은 혼합 Java/Groovy 코드베이스이므로 Groovy 기반의 마법을 사용하는 모든 솔루션이 환영받을 것입니다. –
사용자가 소수점 뒤에 입력 한 숫자의 수 또는 소수점 뒤에 인쇄 할 자릿수를 알고 싶습니까? 그것들은 완전히 다른 두 가지 문제입니다. – erickson
사용자가 입력 한 값입니다. 좋은 지적. –