2009-09-24 5 views
1

Perl에서 NUMERIC (19,5) 형식의 SQL Server 2005 데이터베이스 열에 값을 삽입합니다. 절대 값이 .0001 이상인 경우 작동합니다. 그러나 값을 소수점 다섯째 자리로 이동하면 Perl은 지수 형식 (-0.00009 대신 -9e-05)으로 저장하기 시작하고 SQL Server에서 ""이라는 오류 메시지가 나타납니다. 어떻게이를 방지하고 작은 숫자 값을 올바르게 삽입합니까? 우리는 펄 v5.8.5을 사용하는Perl의 부동 소수점 숫자에서 '데이터 유형 varchar를 숫자로 변환하는 중 오류가 발생합니다'라는 이유가 무엇입니까?

, DBI 1.56, DBD ::베이스 1.07, 및 SQL Server 2005

코드는 대략 다음과 같다,하지만 난 불필요한 필드를 제거했습니다 :

$invoice->{IL_UNITPRICE} = 0.09; # Actually comes from another database 
$invoice->{IL_PRICEUNITCONV} = 0.001; # Actually comes from another database 
$unitprice = $invoice->{IL_UNITPRICE} * -1 * $invoice->{IL_PRICEUNITCONV}; 
#$unitprice equals -9e-05 at this point. 
$sth = $dbh->prepare('INSERT INTO foo (bar) VALUES (?)'); 
$sth->execute($unitprice); 

위의 선은 오류와 함께 실패 : DBD::Sybase::st execute failed: Server message number=8114 severity=16 state=5 line=2 server=baz text=Error converting data type varchar to numeric.

답변

2

을 시도해보십시오

$sth->execute(sprintf("%.6f",$unitprice)); 

비트 확장 - DBi 인터페이스를 통해 기본 float/double을 전달할 때 문자열로 변환됩니다. 지정하지 않으면 Perl의 기본 형식 규칙 (C 컴파일러에서 부과됨)이 사용됩니다. 기본값은 6 자리의 정밀도이며, 그 숫자가 과학 표기법으로 렌더링 된 것 이상이면.

고정 소수점 형식을 얻으려면 sprintf를 사용하여 명시 적으로 요청해야합니다.

+0

Perl의 자동 부동 소수점 형식을 올바르게 처리하는 대신 부동 소수점 숫자를 올바르게 형식화해야한다는 점을 기억해야합니다. – LeBleu

+0

예. 그렇지만 과학 표기법을 사용하기로 결정한 것은 어느 시점에서 발생해야하며 컴파일러의 기본값을 사용하기로 결정했습니다. 자세한 내용은 http://perldoc.perl.org/perlnumber.html –

+0

컴파일러가 아닌 C 라이브러리의 기본값을 참조하십시오. – ysth

0

사실 나는 Math::Bigint과 관련 Math :: BigFloat를 사용하면이 문제를 해결할 수 있다고 생각합니다. 충분한 크기의 수레 또는 숫자를 사용할 때마다이 모듈을 사용하므로 실제로 서식을 제어하고 싶을 때를 제외하고는 sprintf를 던지지 않아도됩니다.

관련 문제